我想在我的代码中使用Extract And Override模式,模式是: 提取一个创建代码所需对象的方法使其成为虚拟并覆盖TextFixture中创建假存根对象的方法,我在The Art Of Unit Testing中已经读过这个。
现在我终于找到了一个可以使用这个想法的地方,但是在我的对象的构造函数中调用该方法,并且VS显示一个警告,说明构造函数包含一个虚方法,而不是我知道为什么这可能是一个问题因为这是将来打破代码的简单方法。
我的问题是,可测试代码的好处是否超出了将来可能导致的问题?
答案 0 :(得分:2)
构造函数应该是哑的 - 它应该构造对象。如果您的类需要复杂的初始化,它应该有一个单独的初始化方法如果可以在派生类中重写初始化,则必须使用单独的方法。在构造函数中调用虚方法的问题是它可以在初始化类型之前从派生类型调用代码。
这在Spring.NET中很好地实现,其中每个对象注册都可以注册初始化和销毁方法。在构造对象并注入所有依赖项之后调用初始化方法。我认为其他IoC容器也有此功能。
答案 1 :(得分:2)
这是TDD爱好者经常使用IoC解决的问题 - 我们的想法是,不是在构造函数中构造正在测试的对象,而是使用IoC容器将其传递给构造函数。然后,对于测试,您将IoC容器配置为使用模拟对象。
答案 2 :(得分:2)
如果忽略此警告,则假定派生类在调用方法之前不关心不进行初始化。这也适用于为单元测试生成的派生类。
即使它似乎有效,但如果模拟框架的实现发生变化,这可能会破坏。或者,当您为方法调用注册约束时,它可能会开始关注。
所以摆脱构造函数中的虚拟。