TargetParameterCountException dans le test unitaire basé sur Moq
Question
Nous avons des référentiels qui ont un " Save " méthode. Ils jettent également un " Créé " événement chaque fois qu'une entité est enregistrée.
Nous essayons d'utiliser Moq pour simuler le référentiel en tant que tel ....
var IRepository = new Mock<IRepository>();
Request request = new Request();
IRepository.Setup(a => a.Save(request)).Raises(a => a.Created += null, RequestCreatedEventArgs.Empty);
Cela ne semble pas fonctionner et j'ai toujours une exception:
System.Reflection.TargetParameterCountException: Non concordance des paramètres.
Tout exemple d'événement moqueur avec Moq serait utile.
La solution
Un délégué de type d'événement standard a généralement deux arguments: un objet émetteur et un objet sous-classe-de-EventArgs. Moq attend cette signature de votre événement, mais ne trouve qu'un seul argument, ce qui provoque l'exception.
Regardez ce code avec mon commentaire, cela devrait fonctionner:
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);
}
Autres conseils
Il semble que tout ce qui est renvoyé par RequestCreatedEventArgs.Empty
ne puisse pas être converti en objet RequestCreatedEventArgs
. Je m'attendrais à ce qui suit:
class IRepository
{
public event THING Created;
}
class THING : EventArgs
{
public static THING Empty
{
get { return new THING(); }
}
}
Vérifiez que THING est la même classe à chaque endroit de votre code, comme indiqué ci-dessus.