Я рекомендую Мок .
Скажем, у вас есть класс 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
.