在一般情况下,我设计这样的方式类为不需要访问士兵用于测试目的。 一个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);
(是的,充满了反模式 - 但请不要拍的使者)
我有一些与此问题:
- 我希望能够澄清,我需要我私处
- 我不希望被调用对话框(是的,我是一个CRaholic)
- 我不希望在图片中涉及的代码生成
所以,我希望能够在上面的代码转换为类似:
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; 打开使用任何动态代理库或其他