Recomiendo Moq.
Digamos que tienes una clase MyClass
define de la siguiente manera:
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
se declara así:
public interface IMyDependency{
void DoWork();
}
Ahora, utilizando Moq, usted podría probar que la dependencia se llama así:
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();
}
Ahora que era un ejemplo muy simple, así que condimentarlo un poco.
clase pública miclase2 {
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
se declara así:
public interface IMyDependency2{
void DoWork(int i);
}
Un método de ensayo que prueba que el parámetro correcto se pasa a la dependencia podría tener este aspecto:
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();
}
Como puede ver, el Setup
método ahora agrega una restricción en el parámetro pasado a DoWork
, diciendo que es un int cuyo valor debe ser el doble del valor de la variable parameter
.
+1 para el enlace de haack – Michel
@Michel Vea también los comentarios en esta publicación, ya que Oran (autor de Rhino Mocks) y Kzu (autor de Moq) van y vienen durante un tiempo. Es hierro afilador de hierro si me preguntas. –