我正在向一些粗糙的遗留代码添加测试,以便有足够的信心认真重构它。问题之一是,编写代码的人显然没有尝试使代码可测试(因为他们从未编写过一个单元测试!)
一个常见的问题是目前没有接口(interface),只有一个 11 级深的继承链。我正在使用 Rhino Mocks 将被测类与其依赖项隔离,但由于我正在模拟一个类,而不是一个接口(interface),所以我只能 stub 具有 virtual
关键字的只读属性。
我目前的想法是,我只会将 virtual
关键字添加到属性中。没有计划将任何其他对象添加到现有的依赖链中,它将允许编写测试。
是否有任何反对添加 virtual
关键字的论据,或者这是为了进行测试而可以接受的妥协?
示例代码...
在测试类中:
var someClassStub = MockRepository.GenerateStub<SomeClass>();
someClassStub.Stub(s => s.SomeProperty).Return("Test");
在某个类中:
public virtual string SomeProperty {
get {
return someDependency.SomeMethod();
}
}
最佳答案
反对添加 virtual
的主要论点是它歪曲了您的意图。 virtual
关键字向派生类发出信号,您希望此属性可能会被覆盖。
我不会使用 virtual
,而是像下面这样模拟依赖项:
var mockedDependency = MockRepository.GenerateMock<IDependency>();
mockedDependency.Expect(x => x.SomeMethod())
.Returns("whatever your test dictates");
var target = new SomeClass(mockedDependency);
mockedDependency.VerifyAllExpectations();
然后将其注入(inject)新创建的重载构造函数,如下所示:
public SomeClass(IDependency dependency) : base()
{
this.someDependency = dependency;
}
关于c# - 测试遗留代码时添加虚拟关键字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15834340/