一般来说,我设计类的方式是为了测试目的不需要访问私有数据。安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 不兼容,但这没关系,因为这仅用于测试。同样 AIUI,私有访问器机制也需要触发重新编译以不时同步内容。
或者有没有更好的方法我错过了?(请记住,我不想将 al privates 全面升级为内部或公共,也不想重写工作代码)
使用 xUnit.net、.NET 3.5;开放使用任何动态代理库或其他