非代码生成的转发垫片用于测试私有方法(Non-code-generated forwarding s

2019-07-29 06:01发布

在一般情况下,我设计这样的方式类为不需要访问士兵用于测试目的。 一个InternalsVisibleTo也可以协助。

不过,我目前正在处理有这已成为依赖于[在VSTS私人存取机制(少数地区代码库http://msdn.microsoft.com/en-us/library/ms184807(VS.80 )的.aspx) (即,使用VSCodeGenAccessors生成*_Accessor已转发在使用反射来调用类private成员(和任选的internal上的类那些太)。

所以,我有这样的代码:

ClassUnderTest target = new ClassUnderTest();
var accessor = ClassUnderTest_Accessor.AttachShadow( target );
accessor.PrivateMethod();
Assert.True( accessor._privateMethodWasCalled);
accessor.PrivateProperty = 5;
Assert.Equal( accessor.PrivateProperty, 5);

(是的,充满了反模式 - 但请不要拍的使者)

我有一些与此问题:

  1. 我希望能够澄清,我需要我私处
  2. 我不希望被调用对话框(是的,我是一个CRaholic)
  3. 我不希望在图片中涉及的代码生成

所以,我希望能够在上面的代码转换为类似:

var target = new ClassUnderTest();
IClassUnderTestInterface accessor = Shadow.Create<IClassUnderTestInterface>( target );
accessor.PrivateMethod();
Assert.True( accessor._privateMethodWasCalled);
accessor.PrivateProperty = 5;
Assert.Equal( accessor.PrivateProperty, 5);

只有以下接口坐在我的测试组件,并没有生成的代码或自定义生成步骤: -

interface IClassUnderTestInterface
{
   int PrivateProperty {get; set;}
   bool _privateMethodWasCalled {get; }
   void PrivateMethod();
}

从那里,我可以使用的CodeRush或Ctrl KM产生新的阴影方法到界面上只有一个按键。

丢失的位将被具有方法I Shadow.Create<I>( Object o)这将产生1实现接口1.验证该对象的动态代理o待包装具有由接口1所规定的所有成员。bnous:管理表示字段(即,`_privateMethodWasCalled”的情况下)性能的转发正确

因此,没有人知道,实现这样的一个库(或觉得有足够的无聊写呢?)

一个明显的缺点是不优尔知道,如果心不是与ClassUnderTest直到运行时commpatible,但没关系,因为这只能是测试的接口。 此外AIUI,私人存取机制也需要重新编译的触发到的东西从时间保持同步时间。

还是有更好的方式方法我失踪? (记住我不想去毯ugrading人私处内部或公共和不想有重写工作代码)

使用xUnit.net,.NET 3.5; 打开使用任何动态代理库或其他

Answer 1:

你看像嘲讽起订量或犀牛框架? 在你的情况下,他们可能会帮助,如果你愿意改变,你需要测试的士兵“受保护的虚拟”(这是不是内部的坏上市)。 基本上,如果成员是虚拟的,然后嘲讽框架可以生成记录成员是所谓的一个子类。



Answer 2:

我结束了这一切的东西路由各地( InternalsVisibleTo ,单独的测试项目,测试参考,私人存取的MSBuild的影子任务/ publicize.exe在建立随机失败,使用反射来访问士兵)通过合并测试分为主体工程和制造任何需要从测试中可以访问internal )。 另请参见xUnit.net测试卸料[取出嵌入在二进制测试代码之前部署/送货]



Answer 3:

这种巧妙的方法 ,可以使转发功能更succint,虽然它在本质上仍然手册

此外, 这个答案介绍了如何处理static成员(但需要CLR4这在我问这个问题的时候wasnt在玩和不处理私有方法,而没有把InternalsVisibleTo来混合使用)。



文章来源: Non-code-generated forwarding shim for testing private methods