如何在单元测试期间访问受保护的基类成员?

时间:2011-11-28 09:38:40

标签: c# unit-testing tdd mstest rhino

我正在mstest中使用rhino mocks创建一个单元测试。我有一个继承B类的A类。我正在测试A类并为我的测试创建一个实例。它继承的类“B”有一些受保护的方法和受保护的属性,我希望为了测试的利益而访问它们。例如,验证我的基类上的受保护属性是否具有预期值。

我在测试期间如何访问B类受保护属性的任何想法?

3 个答案:

答案 0 :(得分:6)

从单元测试的角度来看,这是错误的方法。您应该只测试公共接口并确保它的行为符合预期,您不应该关心私有/受保护的实现细节。所以有:

  • 您要测试的方法/属性确实应该是公开的
  • 您的测试用例/特定测试实现错误

编辑:

有时,在为无法更改的遗留代码编写单元测试时,您可能会被迫访问受保护的成员,在这种情况下,解决方案可能会创建一个wrapper,它会公开内部/公共属性/方法以访问受保护的之一。

还有什么有趣的,你通过TDD标记标记的问题,想象一下当你没有实现时如何能够访问单元测试中的实现细节?这就是TDD的工作原理 - 你有一个接口并在实现完成之前开始编写单元测试。

答案 1 :(得分:2)

受保护的属性应该影响您班级公共行为的某些方面。

测试这种公共行为。

就您的测试而言,该课程的内部工作应该是一个黑盒子。这将使您可以自由地进行重构,而不必弄乱您的测试。唯一重要的是他们揭露的公共事物,这应该是应该测试的。

答案 2 :(得分:2)

除了其他答案指向正确的方向,如果你真的需要像你描述的那样进行测试,那就这样做:

创建一个继承自A的类TestA。使用此选项将B的受保护属性设置为公共测试。如果你有

class B {
    protected string Name {get; set;}
}

class A: B {
    public void DoSomething(string msg) {
        Name = msg.Trim();
    }
}

class TestA: A {
    public string GetName() {
        return Name;
    }
}

在您的测试中,现在使用TestA。我不知道MsTest语法,但大致是这样的:

[Test]
public void TestThatNameWasSet() {
    TestA systemUnderTest = new TestA();
    systemUnderTest.DoSomething("  new name  ");
    Assert.That(systemUnderTest.GetName(), Is.EqualTo("new name");
}