设置字符串参数时,模拟上的所有调用都必须有相应的设置
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();
您正在尝试设置 属性。没有设置模拟来处理。
您使用的 "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)
参考。
我正在测试一个简单的方法。当我 运行 测试时,我得到错误
"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();
您正在尝试设置 属性。没有设置模拟来处理。
您使用的 "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)
参考。