访问私有字段(Accessing private fields)

2019-09-29 09:37发布

首先,我很抱歉,如果问题已经被问,但我不认为任何人喜欢我的(但我认为这是一个很常见的问题),所以我试图做一些单元测试,第一个是已经有问题..

我来测试我的类的构造函数中,我设置了私人领域的实例构造函数。所以我怎么测试,如果这个私有字段不为空? (因为我想的是,我有什么测试) - >测试:

 public BUDGET_MANAGER()
    {
        this.budget_provider = new BUDGET_PROVIDER();
    }

- >测试Mehod:

    [TestMethod()]
    public void BUDGET_MANAGERConstructorTest1()
    {
        BUDGET_MANAGER target = new BUDGET_MANAGER();      
        Assert.IsNotNull(??,"the provider is not instancied");

    }

我怎样才能做到这一点? 感谢您的帮助,我几乎失去了在单元测试..

Answer 1:

在你的单元测试你真的不应该测试什么,是私有的一类。 私有的,内部-唯一已知成员的其暴露的(和测试)功能的类,而不是部分的实现的一部分。

基本上,认为类作为其的外部可见的成员的“合同”。 定义其实际类型,什么一切看到的。 这就是被测试的功能。 内部(私有)成员没有外部类已知的很好的理由,不同的类可以实现以不同的方式,相同的“合同”(或接口),与不同的私有成员。

什么,你要测试的是可见的功能,合同或接口。



Answer 2:

单元测试应该检查私人数据。 他们应该测试的是行为,通过你的类的工作,独立于任何实现细节的接口定义。

一个典型的测试将调用构造函数,然后调用之后的公共属性或方法,检查结果符合市场预期。 这样的检测手段,如果您以后更改您的实现(例如)懒洋洋地构建一个BudgetProvider只有在需要的时候,那么所有的测试仍然可以工作。 实施细节,比如当一个私有成员是或不是null是不相关的类的客户,因此没有必要对其进行测试在单元测试中。



Answer 3:

如果您使用MSTEST,右键单击原类,并按创建测试访问,选择您的测试项目。 然后测试用访问这个条件(应在智能感知显示)。

我不知道它虽然很不错的主意,因为其他海报说。 你将作出实施更加难以改变。



Answer 4:

你should't真正考验你的类的任何私有变量。

为什么你想测试的构造函数本身? 这将是有意义的测试,如果有一些逻辑 。 例如 - 你只构造对象,如果给定的参数是否正确,并创建对象之前,你做验证。 否则,构造对象并验证其行为与预期相同。 据推测,如果构造正确工作对象的行为将是不正确的为好。

此外抵制暴露私有字段作为属性只是为了验证他们在构造函数中设置正确的诱惑。



Answer 5:

其他人提到什么用的单元测试时,你不应该做的事。

我会尽力找到一种方法,做你想做的(你还需要测试你的构造函数):

public BUDGET_MANAGER()
{
    try
    {
        this.budget_provider = new BUDGET_PROVIDER();
    }
    catch {}

    if (this.budget_provider == null)
        throw new NullReferenceException("Budget provider is null !");
}


文章来源: Accessing private fields