【发布时间】:2018-10-16 16:22:34
【问题描述】:
我有一个如下所示的库:
class BaseType {
public string MyFunction() {
return "Abc";
}
}
class MyClass {
public MyClass(BaseType baseType) {
Console.WriteLine(myType.MyFunction());
}
}
现在我正在像这样测试它:
class TestingBaseType : BaseType {
public new string MyFunction() {
return "def";
}
}
class Unittests {
public void Test() {
new MyClass(new TestingBaseType());
//Logs "Abc". But I need "def".
}
}
我的真实代码没有执行注入的模拟BaseClass。如何在不编辑生产代码的情况下进行这样的测试。由于我编写单元测试的方式,我不想编辑生产代码。
【问题讨论】:
-
行为正确。不要将
new与virtual+override混淆。 -
我知道这种行为是正确的,但我不想让
BaseType.MyFunction虚拟,因为我认为单元测试不会影响您的生产代码。人们会想知道为什么方法是虚拟的。 -
使用一个接口和两个独立的实现。如果你渴望依赖注入,无论如何接口都是必经之路。
-
我完全同意@OndrejTucny。在对包含应用程序行为的抽象建模时,优先使用组合而不是继承,并使用接口而不是基类。
标签: c# unit-testing dependency-injection