替换“;密封的“;班

本文关键字:密封 替换 | 更新日期: 2023-09-27 17:57:35

A是引用dll中的一个类,因此无法更改。它有一个方法Foo(),它在我的DoFoo()方法中被调用(以A为参数)。我想在不执行Foo()的情况下测试DoFoo(),因为它很昂贵而且已经测试过了。

在这种情况下,最好的做法是什么?

我对此的看法:

  • 围绕A创建一个包装类,并将其传递到DoFoo()中。包装器类区分真实实现和虚假实现
  • 使用扩展方法也可以做到这一点
  • 使用dynamic并传入一个具有空DoFoo()实现的伪类

替换“;密封的“;班

创建一个包含要公开的方法的接口。

创建一个包装类,该包装类实现该接口,并使用外部程序集的类来完成其工作。您可以创建该接口的其他实现,比如mock实现。

例如,使用构造函数注入将接口注入到需要功能的类中。

在测试中,您可以很容易地将使用外部库的实现替换为模拟实现。

实际上,用Typemock做这件事很容易,你不需要使用包装器或创建接口,你可以模拟它。例如:

测试方法:

public string DoFoo(A a)
    {
        string result = a.Foo();
        return result;
    }
}
sealed public class A
{
    public string Foo()
    {
        throw new NotImplementedException();
    }
}

测试:

[TestMethod,Isolated]
public void TestMethod1()
{
    var a = Isolate.Fake.Instance<A>(Members.CallOriginal);
    Isolate.WhenCalled(() => a.Foo()).WillReturn("TestWorked");
    var classUnderTest = new Class1();
    var result = classUnderTest.DoFoo(a);
    Assert.AreEqual("TestWorked", result);
}