TargetParameterCountException en prueba unitaria basada en Moq
Pregunta
Tenemos repositorios que tienen un " Guardar " método. También arrojan un " Creado " evento cada vez que se guarda una entidad.
Hemos estado tratando de usar Moq para simular el repositorio como tal ...
var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);
Esto no parece funcionar y siempre obtengo una excepción:
System.Reflection.TargetParameterCountException: El recuento de parámetros no coincide.
Cualquier ejemplo de burlarse de eventos con Moq sería útil.
Solución
Un delegado de tipo de evento estándar generalmente tiene dos argumentos: un objeto remitente y un objeto de subclase de EventArgs. Moq espera esta firma de su evento, pero solo encuentra un argumento y esto causa la excepción.
Eche un vistazo a este código con mi comentario, debería funcionar:
public class Request
{
//...
}
public class RequestCreatedEventArgs : EventArgs
{
Request Request {get; set;}
}
//=======================================
//You must have sender as a first argument
//=======================================
public delegate void RequestCreatedEventHandler(object sender, RequestCreatedEventArgs e);
public interface IRepository
{
void Save(Request request);
event RequestCreatedEventHandler Created;
}
[TestMethod]
public void Test()
{
var repository = new Mock<IRepository>();
Request request = new Request();
repository.Setup(a => a.Save(request)).Raises(a => a.Created += null, new RequestCreatedEventArgs());
bool eventRaised = false;
repository.Object.Created += (sender, e) =>
{
eventRaised = true;
};
repository.Object.Save(request);
Assert.IsTrue(eventRaised);
}
Otros consejos
Parece que todo lo que se devuelve desde RequestCreatedEventArgs.Empty
no se puede convertir en un objeto RequestCreatedEventArgs
. Esperaría lo siguiente:
class IRepository
{
public event THING Created;
}
class THING : EventArgs
{
public static THING Empty
{
get { return new THING(); }
}
}
Verifique que THING sea la misma clase en cada lugar de su código como se muestra arriba.