2011-11-28 95 views
4

我正在使用rhino mocks在mstest中创建一个单元测试。我有一个继承类B的类A.我正在测试类A并为我的测试创建一个实例。它继承的类“B”具有一些受保护的方法和受保护的属性,我希望为我的测试带来好处。例如,验证我的基类中的受保护属性具有期望值。单元测试期间如何访问基类的受保护成员?

任何想法如何在我的测试过程中访问这些受保护的B类属性?

+0

如果您需要更多关于如何单元测试特定场景的详细信息 - 请分享您正在测试的代码 – sll

回答

6

从单元测试的角度来看,这是错误的做法。您应该只测试公共接口并确保它的行为如预期,您不应该在乎像private/protected这样的实现细节。因此,有两种:你要真正测试应该是公开的

  • 方法/属性或
  • 测试用例/特定的测试执行是错误的

编辑:

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

另外有趣的是,你用TDD标签标记了问题,试想一下,如果你还没有实现,你将如何在单元测试中访问实现细节?这就是TDD的工作原理 - 你有一个接口,并在实现完成之前开始编写单元测试。

2

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

测试此公共行为。

就您的测试而言,班级的内部工作应该是黑匣子。这将给你重构的自由,而不必惹你的测试。唯一重要的是他们公开的东西是什么,这是应该测试的。

2

除此之外其他的答案将指向正确的方向,如果你真的需要测试像你描述的那样,这样做:

创建一个类种皮从A.使用继承本作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"); 
}