2016-07-19 29 views
2

A是引用的dll中的类,因此无法更改。它有一个方法Foo(),在我的DoFoo()方法(以A作为参数)内部调用。我想测试DoFoo()而不执行Foo(),因为它很昂贵并且已经过测试。替换“密封”类的实现

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

我对这个问题的看法:

  • 周围A创建一个包装类,并将其传递到DoFoo()。包装类区分真实和假实现。
  • 使用扩展方法也可以做到这一点。
  • 使用dynamic并通过虚拟类与空DoFoo()实施。

回答

4

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

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

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

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

+0

有什么接口?只是一个包装类,可以采取真正的方式,或者什么都不做就够了,对吧?我错过了优势吗? –

+0

基于接口的编程,以便能够减少依赖性。真正的实现是通过构造器注入来注入的。所以是的,我推荐使用接口。 –

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); 
} 
+0

链接被破坏,它指向http://www.typemCOk.com/而不是http://www.typemock.com/ – Roman

+1

谢谢罗马我修复它。 – JamesR

+0

看起来不错,我会对他们如何做到这一点感兴趣。但我不认为我会采用商业解决方案。 –