webentwicklung-frage-antwort-db.com.de

Rückgabewert der Moq-Einstellmethode

Ich habe die folgende Klasse, und ich versuche, die Methode AddRecordToQueue zu testen.

Ich benutze Moq, um das Ergebnis der AddToQueue-Methode innerhalb der AddRecordToQueue-Methode zu verspotten.

Die AddToQueue-Methode gibt einen Booleschen Wert zurück, daher versuche ich, das Ergebnis mit einem wahren Wert zu verspotten

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;
    }
}

Meine Testklasse sieht wie folgt aus.

[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);
    }
}

Ich kann nicht scheinen, das moq Ergebnis als zutreffend einzustellen. Kann mir jemand raten was mir fehlt

vielen Dank

19
simon1230756

Ich denke, dass Sie die Returns ändern müssen, um nur true anstelle des Lambda zurückzugeben. So was:

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

BEARBEITEN:

Wenn dies immer noch nicht funktioniert, liegt es wahrscheinlich daran, dass die Parameter nicht übereinstimmen. Sie übergeben in "someExchange" aber das Mock ist für string.Empty eingerichtet. Wenn Sie nicht sicher sind, welche Werte verwendet werden, können Sie das It.IsAny Methode, um dies zu umgehen.

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

Sie müssen die Methode mit den tatsächlichen Argumenten einrichten, die sie aufruft. Wenn JsonConvert.SerializeObject(data) null zurückgibt, ist dies das Setup:

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

Darüber hinaus können Sie die Methode so einrichten, dass sie unabhängig von den Werten der Argumente true/false zurückgibt:

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

Mit dem obigen Setup gibt die Methode true zurück, unabhängig davon, was Sie an die Methode übergeben haben. Das vorherige Beispiel gibt nur dann true zurück, wenn die Methode mit den konfigurierten Argumenten aufgerufen wird.

4
Dimitar Tsonev
  1. Wie die anderen sagten, ist das Setup falsch.
  2. Sie müssen Setupvorher mit dem zugehörigen Object aufrufen

Es sollte ungefähr so ​​aussehen:

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