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

Ben*_*man 5 c# unit-testing mstest moq mocking

我有一个简单的方法正在测试。运行测试时出现错误

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

在最后一行

dataField.DefaultValue = orderNumber.ToString();
Run Code Online (Sandbox Code Playgroud)

是什么原因造成的?

我只是在设定一个领域。

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();
}
Run Code Online (Sandbox Code Playgroud)

这是我的单元测试代码。

[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);
}
Run Code Online (Sandbox Code Playgroud)

Nko*_*osi 7

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

corelDataField.SetupAllProperties();
Run Code Online (Sandbox Code Playgroud)

您的初始设置

corelDataField
    .Setup(s => s.DefaultValue)
    .Returns(orderNumber);
Run Code Online (Sandbox Code Playgroud)

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

你打电话时

dataField.DefaultValue = orderNumber.ToString();
Run Code Online (Sandbox Code Playgroud)

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

参考:起订量快速入门


Old*_*Fox 7

您使用的是“严格模拟”,这是不正确的做法(极少数情况除外)。这种做法不好的原因很简单。您的UT也变得过于依赖于实现,而不是验证特定案例的行为。

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

  • 这是一个主观答案(通常不是坏习惯),它无法解释关闭此功能的含义。是的,它可能会解决问题,但这是一个大锤解决方案,您应该了解这样做时您要放弃什么。 (3认同)