【问题标题】:Moq setting method return valueMoq 设置方法返回值
【发布时间】:2015-12-14 11:47:26
【问题描述】:

我有以下课程,我正在尝试测试 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。谁能告诉我我错过了什么

谢谢

【问题讨论】:

  • 不是在机器上进行测试,但我在这里看到了两件事。 1. 在获得对.Object 的引用之前,您应该先Setup; 2.在Setup中,将参数设置为null,并为空,尝试使用Setup(e =&gt; e.AddToQueue(It.IsAny(), Is.IsAny())).Returns(true))
  • 其实在获取Object之前不需要做Setup

标签: c# unit-testing moq


【解决方案1】:

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

【讨论】:

  • 确保在您的设置中使用 It.IsAny 来处理所有参数,而不是您安排的某些测试变量。
【解决方案2】:

您需要使用调用的实际参数设置方法。 如果JsonConvert.SerializeObject(data) 返回 null,那么这就是设置:

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

此外,您可以将方法设置为返回真/假,而不管参数的值如何:

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

通过上述设置,无论您向该方法传递了什么内容,该方法都将返回true。仅当使用设置的参数调用方法时,上一个示例才会返回 true。

【讨论】:

    【解决方案3】:
    1. 正如其他人所说,设置不正确。
    2. 您需要调用Setup之前使用关联的Object

    它应该类似于:

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

    【讨论】:

    • 这不是真的。 .Setup 参数不匹配,但之前可以使用对 .Object 的引用(例如在夹具设置中)。
    • 如果这个答案完全错误,为什么还要 +1 票?
    猜你喜欢
    • 1970-01-01
    • 2018-04-05
    • 1970-01-01
    • 2016-06-26
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多