我的道歉,如果这是一个重复的。 我一直在考虑增加一些覆盖该方法的任务,被告知要嘲笑私人List<string>
属性。 我的问题是: 有没有一种方法来测试私有字段?
我找到了解决办法是增加新的构造方法仅注入本次非公开名单。 我不知道这是否是正确的方式,因此任何帮助将不胜感激。
public class Class1
{
public Class1(List<string> list)//This is just for Unit Testing
{
list1 = list;
}
private readonly InjectRepository _repository;
//
public Class1(InjectRepository repository)//This is the actual constructor
{
_repository = repository;
}
private List<string> list1 = new List<string>();
public void Do_Complex_Logic()
{
//list1 will be set with items in it
//Now list1 is passed to some other instance
}
}
一类的私有逻辑应该是其行为的公开表达可见。 换句话说,从理论上说,应该没有必要在所有测试私有字段。
有没有办法直接测试私有字段; 他们毕竟是私有的。 如果你真的认为测试私有字段是必须的,那么我建议使得它的内部,而不是,并通过它暴露在你的单元测试组件[InternalsVisibleTo]属性。
话虽这么说,有框架,允许这样的事情,如TypeMock 。
不要测试私有字段或方法。 测试合同的行为 - 公共或内部的方法。
这就是说,你可以试试:
选项A
让私有成员内部并设置InternalsVisibleTo
属性被测总成。
选项B
编写包装你的私有字段/方法成公共的一个包装类。 这种方法有,你不需要让你的私有方法的内部受益。 其缺点是,对于每一个私有方法,你将有一个包装公共方法。 所以方法的量可能增加一倍。
添加到什么womp&奥莱克西已经说过 -
你想/事实需要测试的私有方法是一个标志(气味?),你的设计可能是不正确的。 这是TDD(和我个人最喜欢的)的积极的副作用之一。
一个例子:
我不完全知道你的域名在这里,但一个简单的变化可能是,而不是Do_Complex_Logic
采取任何参数,你可以有它接受和返回一个List<string>
:
public List<string> Do_Complex_Logic( List<string> input )
我知道-这很简单 ,但尝试解构你的类了一下,在头脑里的测试首先建立了回去。
我不跟其他的答案不同意; 但在这种情况下,我认为最合适的事情 - 给你的代码; 是改变的签名
'Do_Complex_Logic'
真正的问题是,你正在处理在List1的“国家”。 如果您通过列表1到Do_Complex_Logic - 你的问题主要是解决了。 您的评论说,“Do_Complex_Logic”打算(可能)做的List1一些工作,然后将其传递到别的东西,对不对?
让Do_Complex_Logic采取列表,并返回一个列表。 现在很容易进行测试。 相反,根据列表1中的类被正确安装的状态,你可以“注入的依赖”。
如何在私人领域在第一时间拿到的地方准备? 如果是通过与资料库的互动,那么你可以嘲笑可能该对象。
要做到这一点的方法之一是通过接口与存储库进行交互(姑且称之为IInjectRepository
,而不是一个具体的实体,然后使用类似最小起订量 (或嘲讽的框架存在的许多过剩的一个)通过模拟来填充你的数据“d仓库为你设置你的测试。你叫后Do_Complex_Logic
我假设你有询问的实体的方法,让你知道它做你预料到了。这样就可以避免/减轻并称是方法和类什么唯一的测试。
在回答mensioned你可以使用反射 https://stackoverflow.com/a/3376157/1523402一个相关的问题的。
我不知道是不是私人的存取也为私人领域的工作。 但是,他们帮助(至少)的私有方法(见http://msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx )。