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.

Était-ce 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top