首页 > 解决方案 > 通过依赖注入注入派生测试类使用基类函数

问题描述

我有一个看起来像这样的库:

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".
    }
}

我的真实代码没有执行注入的 mock BaseClass。如何在不编辑生产代码的情况下进行这样的测试。由于我编写单元测试的方式,我不想编辑生产代码。

标签: c#unit-testingdependency-injection

解决方案


如果你不能使基类的方法成为虚拟的,那么就不要使用派生类,而是声明一个接口。无论如何,接口是实现有效依赖注入的关键概念。

生产代码:

public interface IType
{
    string MyFunction();
}

public class MyType : IType
{
    public string MyFunction() => "Abc";
}

class MyClass 
{
    public MyClass(IType myType) 
    {
        Console.WriteLine(myType.MyFunction());
    }
}

测试代码:

public class MyTestingType : IType
{
    public string MyFunction() => "Def";
}

class Unittests 
{
    public void Test() 
    {
        new MyClass(new MyTestingType());
    }
}

推荐阅读