web-dev-qa-db-fra.com

Valeur de retour de la méthode de réglage Moq

J'ai la classe ci-dessous et j'essaie de tester la méthode AddRecordToQueue.

J'utilise Moq pour simuler le résultat de la méthode AddToQueue dans la méthode AddRecordToQueue.

La méthode AddToQueue renvoie un booléen, donc j'essaie de se moquer du résultat avec une vraie valeur

public class Test
{
    private readonly IRabbitMqConnection rabbitMqConnection;

    public Test(IRabbitMqConnection rabbitMqConnection)
    {
        this.rabbitMqConnection = rabbitMqConnection;

    }

    public bool AddRecordToQueue(string messageExchange, object data)
    {
        var jsonified = JsonConvert.SerializeObject(data);
        var customerBuffer = Encoding.UTF8.GetBytes(jsonified);
        var result = this.rabbitMqConnection.AddToQueue(customerBuffer, messageExchange);
        return result;
    }
}

Ma classe de test ressemble à ce qui suit.

[TestClass]
public class TestCon
{
    [TestMethod]
    public void MockTest()
    {
        Moq.Mock<IRabbitMqConnection> rabbitConection = new Moq.Mock<IRabbitMqConnection>();

        var draftContactsManager = new Test(rabbitConection.Object);

        rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns((bool res) => true);

        var result = draftContactsManager.AddRecordToQueue("someExchange", null);

        Assert.IsTrue(result);
    }
}

Je n'arrive pas à définir le résultat moq comme vrai. Quelqu'un peut-il me dire ce qui me manque

merci

19
simon1230756

Je pense que vous devez changer le Returns pour retourner juste vrai au lieu du lambda. Comme ça:

rabbitConection.Setup(e => e.AddToQueue(null, string.Empty)).Returns(true)

ÉDITER:

Si cela ne fonctionne toujours pas, cela est probablement dû au fait que les paramètres ne correspondent pas. Vous passez par "someExchange" mais la maquette est configurée pour la chaîne. Vide. Si vous n'êtes pas sûr des valeurs qui seront utilisées, vous pouvez utiliser le It.IsAny méthode pour contourner ce problème.

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true)
20
TomDoesCode

Vous devez configurer la méthode avec les arguments réels qu'elle a invoqués. Si JsonConvert.SerializeObject(data) renvoie null, alors voici la configuration:

rabbitConection.Setup(e => e.AddToQueue(null, "someExchange")).Returns(true)

En outre, vous pouvez configurer la méthode pour renvoyer true/false indépendamment des valeurs des arguments:

rabbitConection.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>())).Returns(true)

Avec la configuration ci-dessus, la méthode renverra true peu importe ce que vous avez transmis à la méthode. L'exemple précédent ne renvoie true que lorsque la méthode est appelée avec les arguments configurés.

4
Dimitar Tsonev
  1. Comme les autres l'ont dit, la configuration est incorrecte.
  2. Vous devez appeler Setupavant en utilisant le Object associé

Cela devrait ressembler à:

...
rabbitConection
    .Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>()))
    .Returns(true);
var draftContactsManager = new Test(rabbitConection.Object);
...
1
Eris