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
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)
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.
Setup
vorher mit dem zugehörigen Object
aufrufenEs sollte ungefähr so aussehen:
...
rabbitConection
.Setup(e => e.AddToQueue(It.IsAny<byte[]>(), It.IsAny<string>()))
.Returns(true);
var draftContactsManager = new Test(rabbitConection.Object);
...