替换"密封"的实施类

时间:2016-07-19 14:16:42

标签: c# unit-testing

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

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

我对此的看法:

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

2 个答案:

答案 0 :(得分:4)

创建一个包含要公开的方法的界面。

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

将构造函数注入的接口注入到需要该功能的类中。

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

答案 1 :(得分:1)

实际上使用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);
}