【发布时间】:2011-06-22 21:00: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);
(是的,充满了反模式 - 但请不要向信使开枪)
我对此有很多问题:
- 我希望能够澄清我需要哪些隐私
- 我不想调用对话框(是的,我是 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 K M 在界面上生成新的阴影方法,只需要一个按键。
缺少的部分将有一个方法I Shadow.Create<I>( Object o)
1.生成实现接口的动态代理
1.验证要包装的对象o是否具有接口规定的所有成员
1. bnous:正确管理表示字段的属性的转发(即`_privateMethodWasCalled'案例)
那么,有没有人知道一个库实现了类似的东西(或者觉得写它很无聊?)
一个明显的缺点是直到运行时你才知道接口是否与 ClassUnderTest 不兼容,但这没关系,因为这仅用于测试。同样 AIUI,私有访问器机制也需要触发重新编译以不时同步内容。
或者有没有更好的方法我错过了? (请记住,我不想将 al privates 全面升级为内部或公共,也不想重写工作代码)
使用 xUnit.net、.NET 3.5;开放使用任何动态代理库或其他
【问题讨论】:
标签: .net testing reflection xunit.net internalsvisibleto