我正在测试一种简单的方法。当我运行测试时,我得到了错误
“模拟上的所有调用都必须有相应的设置”
在最后一行
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);
}
答案 0 :(得分:3)
如果您希望模拟的属性保留指定的值,请致电SetupAllProperties
corelDataField.SetupAllProperties();
您的初始设置
corelDataField
.Setup(s => s.DefaultValue)
.Returns(orderNumber);
仅用于获取值,而不是设置它。
致电时
dataField.DefaultValue = orderNumber.ToString();
您正在尝试设置该属性。哪个模拟器没有设置处理。
答案 1 :(得分:3)
您正在使用"Strict Mock",这被视为不良做法(罕见情况除外)。 这是一个不好的做法的原因很简单;您的UT过于依赖于实施而不是验证特定案例的行为。
只需从模拟初始化中删除MockBehavior.Strict
,然后一切都会正常工作。