替换“;密封的“;班
本文关键字:密封 替换 | 更新日期: 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);
}