在C#中哪些好的做法,以测试/注入私人领域(What are the good practice t

2019-09-19 20:16发布

我的道歉,如果这是一个重复的。 我一直在考虑增加一些覆盖该方法的任务,被告知要嘲笑私人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
    }
}

Answer 1:

一类的私有逻辑应该是其行为的公开表达可见。 换句话说,从理论上说,应该没有必要在所有测试私有字段。

有没有办法直接测试私有字段; 他们毕竟是私有的。 如果你真的认为测试私有字段是必须的,那么我建议使得它的内部,而不是,并通过它暴露在你的单元测试组件[InternalsVisibleTo]属性。

话虽这么说,有框架,允许这样的事情,如TypeMock 。



Answer 2:

不要测试私有字段或方法。 测试合同的行为 - 公共或内部的方法。

这就是说,你可以试试:

选项A
私有成员内部并设置InternalsVisibleTo属性被测总成。

选项B
编写包装你的私有字段/方法成公共的一个包装类。 这种方法有,你不需要让你的私有方法的内部受益。 其缺点是,对于每一个私有方法,你将有一个包装公共方法。 所以方法的量可能增加一倍。



Answer 3:

添加到什么womp&奥莱克西已经说过 -

你想/事实需要测试的私有方法是一个标志(气味?),你的设计可能是不正确的。 这是TDD(和我个人最喜欢的)的积极的副作用之一。

一个例子:

我不完全知道你的域名在这里,但一个简单的变化可能是,而不是Do_Complex_Logic采取任何参数,你可以有它接受和返回一个List<string>

public List<string> Do_Complex_Logic( List<string> input )

我知道-这很简单 ,但尝试解构你的类了一下,在头脑里的测试首先建立了回去。



Answer 4:

我不跟其他的答案不同意; 但在这种情况下,我认为最合适的事情 - 给你的代码; 是改变的签名

'Do_Complex_Logic'

真正的问题是,你正在处理在List1的“国家”。 如果您通过列表1到Do_Complex_Logic - 你的问题主要是解决了。 您的评论说,“Do_Complex_Logic”打算(可能)做的List1一些工作,然后将其传递到别的东西,对不对?

让Do_Complex_Logic采取列表,并返回一个列表。 现在很容易进行测试。 相反,根据列表1中的类被正确安装的状态,你可以“注入的依赖”。



Answer 5:

如何在私人领域在第一时间拿到的地方准备? 如果是通过与资料库的互动,那么你可以嘲笑可能该对象。

要做到这一点的方法之一是通过接口与存储库进行交互(姑且称之为IInjectRepository ,而不是一个具体的实体,然后使用类似最小起订量 (或嘲讽的框架存在的许多过剩的一个)通过模拟来填充你的数据“d仓库为你设置你的测试。你叫后Do_Complex_Logic我假设你有询问的实体的方法,让你知道它做你预料到了。这样就可以避免/减轻并称是方法和类什么唯一的测试。



Answer 6:

在回答mensioned你可以使用反射 https://stackoverflow.com/a/3376157/1523402一个相关的问题的。
我不知道是不是私人的存取也为私人领域的工作。 但是,他们帮助(至少)的私有方法(见http://msdn.microsoft.com/en-us/library/ms184807%28v=vs.80%29.aspx )。



文章来源: What are the good practice to test/inject private field in C#