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.

¿Fue ú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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top