设置字符串参数时,模拟上的所有调用都必须有相应的设置

All invocation on the mock must have a corresponding setup when setting string parameter

我正在测试一个简单的方法。当我 运行 测试时,我得到错误

"All invocation on the mock must have a corresponding setup"

最后一行

dataField.DefaultValue = orderNumber.ToString();

什么会导致这种情况?

我只是设置一个字段。

void IUtilities.SetOrderIdInDocumentMetaData(Document document, int orderNumber)
{
    DataField dataField = null;
    if (document.DataFields.IsPresent(ORDER_ID) == false)
    {
        dataField = document.DataFields.Add(ORDER_ID, AppDefault: false, DocDefault: false);
    }
    else
    {
        dataField = document.DataFields[ORDER_ID];
    }

    dataField.DefaultValue = orderNumber.ToString();
}

这是我的单元测试代码。

[TestMethod]
public void Utilities_SetOrderIdInDocumentMetaData_SetNew()
        {
    string orderNumber = "1";
    int orderId = 1;

    corelDocument
        .Setup(s => s.DataFields.IsPresent(ORDER_ID))
        .Returns(false);

    corelDocument
        .Setup(s => s.DataFields.Add(ORDER_ID, null, false, false, false))
        .Returns(corelDataField.Object);

    corelDataField
        .Setup(s => s.DefaultValue)
        .Returns(orderNumber);

    Utilities.SetOrderIdInDocumentMetaData(corelDocument.Object, orderId);

    Assert.AreEqual(orderNumber, corelDataField.Object.DefaultValue);
}

如果您希望模拟的属性保留分配的值,请调用 SetupAllProperties

corelDataField.SetupAllProperties();

您的初始设置

corelDataField
    .Setup(s => s.DefaultValue)
    .Returns(orderNumber);

只是为了获取值,而不是设置它。

当你打电话时

dataField.DefaultValue = orderNumber.ToString();

您正在尝试设置 属性。没有设置模拟来处理。

参考:Moq Quickstart

您使用的 "Strict Mock" 被视为不良做法(极少数情况除外)。 这是一种不好的做法,原因很简单;您的 UT 变得过于依赖于实现而不是验证特定情况下的行为。

只需从模拟初始化中删除 MockBehavior.Strict,然后一切正常。

我有如下界面。

public interface IEventGridTopic
{
  Task PublishCompanyOnboarding(string companyName);
}

我已经像这样设置了最小起订量。

eventGridTopicMock.Setup(eventGridTopic => eventGridTopic.PublishCompanyOnboarding(It.IsAny<string>()));

现在我收到以下消息,因为测试失败了。

IEventGridTopic.PublishCompanyOnboarding("asdfasdf") invocation failed with mock behavior Strict. Invocation needs to return a value and therefore must have a corresponding setup that provides it.

因此 return 值未配置。我没有配置它,因为我认为它是 returning 任务,意味着无效,什么都没有。

所以我改成下面这样就可以通过了

eventGridTopicMock.Setup(eventGridTopic => eventGridTopic.PublishCompanyOnboarding(It.IsAny<string>())).Returns(Task.CompletedTask);

添加Returns(Task.CompletedTask)

参考。