Moq设置方法返回值

本文关键字:返回值 方法 设置 Moq | 更新日期: 2023-09-27 18:13:07

我有下面的类,我正试图测试方法AddRecordToQueue。

我使用Moq来模拟AddRecordToQueue方法中AddToQueue方法的结果。

AddToQueue方法返回一个布尔值,所以我试图用真值模拟结果

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

我的测试类如下所示。

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

我似乎不能设置moq结果为真。谁能告诉我缺少什么?

谢谢

Moq设置方法返回值

我认为您需要更改Returns以仅返回true而不是lambda。这样的:

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

如果仍然不起作用,则可能是由于参数不匹配。您正在传入"someExchange",但模拟设置为string.Empty。如果你不确定将使用什么值,你可以使用It.IsAny方法来解决这个问题。

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

您需要使用调用该方法的实际参数设置该方法。如果JsonConvert.SerializeObject(data)返回null,则设置如下:

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

此外,您可以设置该方法返回true/false,而不管参数的值:

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

在上面的设置中,无论您向方法传递了什么,该方法都将返回true。上一个示例只有在使用设置好的参数调用方法时才会返回true。

  1. 正如其他人所说,设置是不正确的。
  2. 您需要在之前通过关联的Object
  3. 呼叫Setup

应该类似于:

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