我推荐Moq。
假设你有一个类MyClass,定义如下:
public class MyClass{
private IMyDependency dependency;
public MyClass(IMyDependency dependency){
this.dependency = dependency;
}
public void DoSomething(){
//invoke a method on the dependency
this.dependency.DoWork();
}
}
IMyDependency 声明如下:
public interface IMyDependency{
void DoWork();
}
现在使用 Moq,您可以测试依赖项是这样调用的:
public void DoSomethingWillInvokeDoWorkCorrectly()
{
var mock = new Mock<IMyDependency>();
mock.Setup(imd => imd.DoWork()).Verifiable();
var sut = new MyClass(mock.Object);
sut.DoSomething();
//Verify that the mock was called correctly
mock.Verify();
}
现在这是一个非常简单的例子,所以让我们来加点趣味。
公共类 MyClass2{
private IMyDependency2 dependency;
public MyClass2(IMyDependency2 dependency){
this.dependency = dependency;
}
public void DoSomething(int i){
//invoke a method on the dependency
this.dependency.DoWork(i * 2);
}
}
IMyDependency2 声明如下:
public interface IMyDependency2{
void DoWork(int i);
}
测试是否将正确的参数传递给依赖项的测试方法可能如下所示:
public void DoSomethingV2WillInvokeDoWorkCorrectly()
{
var mock = new Mock<IMyDependency2>();
int parameter = 60;
mock.Setup(imd => imd.DoWork(It.Is<int>(i => i == 2 * parameter)).Verifiable();
var sut = new MyClass2(mock.Object);
sut.DoSomething(parameter);
//Verify that the mock was called correctly
mock.Verify();
}
如您所见,Setup 方法现在对传递给DoWork 的参数添加了一个约束,表示它是一个int,其值必须是parameter 变量值的两倍。