baseada em Moq TargetParameterCountException na unidade de teste
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.
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.