Pergunta

Temos repositórios que têm um método "Save". Eles também jogar um "Criado" de eventos sempre que uma entidade é salva.

Temos tentado usar Moq para zombar fora do repositório como tal ....

var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);

Este não parece trabalho e eu sempre obter uma exceção:

System.Reflection.TargetParameterCountException: Parâmetro contagem incompatibilidade.

Qualquer exemplo de zombando eventos com Moq seria útil.

Foi útil?

Solução

Um tipo de evento delegado padrão tem dois argumentos geralmente: um objeto emissor e um objeto de subclasse-de-EventArgs. Moq espera que esta assinatura de seu evento, mas só encontra um argumento e isso faz com que a exceção.

Dê uma olhada este código com o meu comentário, ele deve 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);
    }

Outras dicas

Parece que tudo o que está sendo devolvido a partir RequestCreatedEventArgs.Empty não pode ser convertido em um objeto RequestCreatedEventArgs. Eu esperaria o seguinte:

class IRepository
{ 
    public event THING Created; 
}
class THING : EventArgs
{ 
    public static THING Empty 
    { 
        get { return new THING(); } 
    } 
}

Verifique se coisa é a mesma classe em cada lugar em seu código como mostrado acima.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top