访问私人领域

时间:2011-02-25 22:27:34

标签: c# unit-testing moq

首先我很抱歉,如果问题已经被问到,但我找不到像我这样的人(但我认为这是一个非常常见的问题) 所以我正在尝试进行一些单元测试,第一个已经存在问题..

我必须测试我的类的构造函数,在构造函数中我设置了一个私有字段的实例。那么如何测试此PRIVATE字段是否为空? (因为我认为是我必须测试的) - >测试:

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

- >测试方法:

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

    }

我该怎么做?谢谢你的帮助,我在单元测试中很丢失..

5 个答案:

答案 0 :(得分:4)

在你的单元测试中,你真的不应该测试任何私有的类。私有的,仅在内部知道的成员是该类实现的一部分,而不是其暴露(和测试)功能的一部分。

基本上,将外部可见的成员视为“契约”。这定义了它的实际类型,其他所有内容。这就是正在测试的功能。内部(私人)成员出于很好的理由在课堂外是不可知的,不同的课程可以以不同的方式实现相同的“合同”(或界面),具有不同的私人成员。

您正在测试的是可见功能,合同或界面。

答案 1 :(得分:2)

单元测试检查私人数据。他们应该测试您的类的接口定义的行为是否有效,与任何实现细节无关。

典型的测试会调用构造函数,然后调用公共属性或方法并检查结果是否符合预期。以这种方式进行测试意味着,如果您稍后将实现更改为(例如)仅在需要时延迟构建BudgetProvider,那么所有测试仍然有效。实现详细信息(例如私有成员是否为空)与您的类的客户无关,因此无需在单元测试中对其进行测试。

答案 2 :(得分:1)

如果您使用mstest,请右键单击原始类并按create test accessor,选择您的测试项目。然后使用访问器测试此条件(应显示在intellisense中)。

我不确定这是一个非常好的主意,正如其他海报所说的那样。您将使实施更难以改变。

答案 3 :(得分:1)

你不应该真正测试你的类的任何私有变量。

为什么要测试构造函数本身?如果有一些逻辑,测试它是有意义的。例如 - 如果给定的参数正确并且在创建对象之前进行验证,则只构造对象。否则,构造对象并验证它是否按预期运行。假设构造函数工作不正确,对象的行为也会不正确。

还要抵制将私有字段作为属性公开的诱惑,以验证它们是否在构造函数中正确设置。

答案 4 :(得分:0)

其他人提到了使用单元测试时不应该做的事情。

我会尝试找到一种方法来做你想做的事情(你还需要测试你的构造函数):

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

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