254 votes

Moq: Comment obtenir un paramètre passé à une méthode d'un moqué de service

Imaginez cette classe

public class Foo {

    private Handler _h;

    public Foo(Handler h)
    {
        _h = h;
    }

    public void Bar(int i)
    {
        _h.AsyncHandle(CalcOn(i));
    }

    private SomeResponse CalcOn(int i)
    {
        ...;
    }
}

Mo(q)roi de Gestionnaire dans un test de Toto, comment pourrais-je être en mesure de vérifier ce qu' Bar() a été transmis _h.AsyncHandle?

369voto

Gamlor Points 6823

Vous pouvez utiliser la Maquette.Rappel de la méthode:

var mock = new Mock<Handler>();
SomeResponse result = null;
mock.Setup(h => h.AnsyncHandle(It.IsAny<SomeResponse>()))
    .Callback<SomeResponse>(r => result = r);

// do your test
new Foo(mock.Object).Bar(22);
Assert.NotNull(result);

Si vous voulez seulement de vérifier quelque chose de simple sur le passé en argument, vous pouvez également le faire directement:

mock.Setup(h => h.AnsyncHandle(It.Is<SomeResponse>(response => response != null)));

22voto

Pete Martin Points 461

Gamlor la réponse de travaux, mais une autre façon de faire (et que je considère être plus expressif dans le test), c'est...

var mock = new Mock<Handler>();
var desiredParam = 47; // this is what you want to be passed to AsyncHandle
new Foo(mock.Object).Bar(22);
mock.Verify(h => h.AsyncHandle(desiredParam), Times.Once());

Vérifier, c'est très puissant, et la peine de prendre le temps pour s'y habituer.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X