Moq设置方法返回值

时间:2015-09-17 14:41:01

标签: c# unit-testing moq

我有以下类,我正在尝试测试方法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结果设置为true。任何人都可以建议我缺少什么

感谢

3 个答案:

答案 0 :(得分:19)

我认为您需要将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)

答案 1 :(得分:3)

您需要使用调用的实际参数设置方法。 如果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。只有在使用setuped参数调用方法时,前一个示例才会返回true。

答案 2 :(得分:1)

  1. 正如其他人所说,安装程序不正确。
  2. 您需要使用关联的Setup
  3. 在之前致电Object

    它应该类似于:

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