A
是引用的dll中的类,因此无法更改。它有一个方法Foo()
,在我的DoFoo()
方法(以A
作为参数)内部调用。我想测试DoFoo()
而不执行Foo()
,因为它很昂贵并且已经过测试。替换“密封”类的实现
在这种情况下最好的做法是什么?
我对这个问题的看法:
- 周围
A
创建一个包装类,并将其传递到DoFoo()
。包装类区分真实和假实现。 - 使用扩展方法也可以做到这一点。
- 使用
dynamic
并通过虚拟类与空DoFoo()
实施。
A
是引用的dll中的类,因此无法更改。它有一个方法Foo()
,在我的DoFoo()
方法(以A
作为参数)内部调用。我想测试DoFoo()
而不执行Foo()
,因为它很昂贵并且已经过测试。替换“密封”类的实现
在这种情况下最好的做法是什么?
我对这个问题的看法:
A
创建一个包装类,并将其传递到DoFoo()
。包装类区分真实和假实现。dynamic
并通过虚拟类与空DoFoo()
实施。创建一个包含您想要公开的方法的接口。
创建一个包装类,实现该接口并使用外部程序集的类来完成其工作。您可以创建此接口的其他实现,如模拟实现。
将构造函数注入的接口例如注入到需要该函数的类中。
在您的测试中,您可以轻松地将使用外部库的实现替换为您的模拟实现。
其实它很容易与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);
}
有什么接口?只是一个包装类,可以采取真正的方式,或者什么都不做就够了,对吧?我错过了优势吗? –
基于接口的编程,以便能够减少依赖性。真正的实现是通过构造器注入来注入的。所以是的,我推荐使用接口。 –