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

时间:2018-06-08 14:51:33

标签: c# unit-testing mocking moq mstest

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

  

“模拟上的所有调用都必须有相应的设置”

在最后一行

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

2 个答案:

答案 0 :(得分:3)

如果您希望模拟的属性保留指定的值,请致电SetupAllProperties

corelDataField.SetupAllProperties();

您的初始设置

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

仅用于获取值,而不是设置它。

致电时

dataField.DefaultValue = orderNumber.ToString();

您正在尝试设置该属性。哪个模拟器没有设置处理。

参考:Moq Quickstart

答案 1 :(得分:3)

您正在使用"Strict Mock",这被视为不良做法(罕见情况除外)。 这是一个不好的做法的原因很简单;您的UT过于依赖于实施而不是验证特定案例的行为。

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