【问题标题】:All invocation on the mock must have a corresponding setup when setting string parameter设置字符串参数时,mock上的所有调用都必须有相应的设置
【发布时间】:2018-11-18 16:05:26
【问题描述】:

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

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

在最后一行

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

【问题讨论】:

  • mock.SetupAllProperties(); 如果您希望模拟的属性为零售值。

标签: c# unit-testing mocking moq mstest


【解决方案1】:

如果您希望 mock 的属性保留分配的值,请致电 SetupAllProperties

corelDataField.SetupAllProperties();

您的初始设置

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

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

当你打电话时

dataField.DefaultValue = orderNumber.ToString();

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

参考:Moq Quickstart

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 这是一个主观的答案(这通常不是坏习惯),不能解释关闭它的含义。是的,它可能会解决问题,但它是一个大锤式的解决方案,您应该了解在这样做时要放弃什么。
    • @stuartdotnet strict mock 在调用任何没有期望的调用时引发异常。当您使用它时,您通常会测试不止一件事并使您的 UT 不仅仅测试行为。在大多数情况下,随着时间的推移,它会给您带来更多的麻烦,而不是帮助,因为实时代码正在更改并且 UT 会下降,尽管行为没有改变,没有它,您根本不会触摸您的 UT。这通常是第一次尝试 UT 的公司倒下的地方。
    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    相关资源
    最近更新 更多