C# Moq回调不使用3参数方法

C# Moq回调不使用3参数方法,c#,unit-testing,moq,C#,Unit Testing,Moq,我试图理解为什么下面的单元测试不执行回调。如果我修改代码,使UpdateWorklowInstanceState方法只包含2个参数(Guid和IList),它就可以工作。但是,有3个参数会产生干扰 我所说的干扰是指回调似乎没有执行。没有错误消息。我希望看到“错误发生”消息,但收到的是“元素更新”消息,这意味着回调没有使用NotificationMessage填充resultMessages public void BusinessObjectReturnsErrorNotification_Re

我试图理解为什么下面的单元测试不执行回调。如果我修改代码,使UpdateWorklowInstanceState方法只包含2个参数(Guid和IList),它就可以工作。但是,有3个参数会产生干扰


我所说的干扰是指回调似乎没有执行。没有错误消息。我希望看到“错误发生”消息,但收到的是“元素更新”消息,这意味着回调没有使用NotificationMessage填充resultMessages

public void BusinessObjectReturnsErrorNotification_ReturnErrorMessage()
        {
            var workflowInstanceGuid = Guid.NewGuid();

            var workflowElementModel = new WorkflowElementModel
            {
                ElementName = "ValidName",
                WorkflowInstanceId = workflowInstanceGuid.ToString()
            };

            var workflowElementInstance = new WorkflowElementInstance
            {
                ElementName = workflowElementModel.ElementName,
                FullDescription = "Full Description",
                SummaryDescription = "Summary Description",
                RefTime = DateTime.Now,
                ElementType = "ElementType"
            };

            var mockWebApiBusinessObject = new Mock<IWebApiBusinessObject>();
            mockWebApiBusinessObject.Setup(m => m.UpdateWorkflowInstanceState(workflowInstanceGuid, workflowElementInstance, It.IsAny<List<NotificationMessage>>()))
                .Callback<Guid, WorkflowElementInstance, IList<NotificationMessage>>(
                    (workflowInstanceId, elementDetails, resultMessages) =>
                    {
                        resultMessages.Add(new NotificationMessage("An Error Occured!", MessageSeverity.Error));
                    });

            var controller = new WorkflowElementController(mockWebApiBusinessObject.Object);
            var result = controller.UpdateWorkflowElement(workflowElementModel);

            Assert.AreEqual("An Error Occured!", result.Content.ReadAsStringAsync().Result);
        }
public void BusinessObjectReturnsErrorNotification\u ReturnErrorMessage()
{
var workflowInstanceGuid=Guid.NewGuid();
var workflowElementModel=新的workflowElementModel
{
ElementName=“ValidName”,
WorkflowInstanceId=workflowInstanceGuid.ToString()
};
var workflowElementInstance=新的workflowElementInstance
{
ElementName=workflowElementModel.ElementName,
FullDescription=“Full Description”,
SummaryDescription=“摘要描述”,
RefTime=DateTime。现在,
ElementType=“ElementType”
};
var mockWebApiBusinessObject=new Mock();
mockWebApiBusinessObject.Setup(m=>m.UpdateWorkflowInstanceState(workflowInstanceGuid、workflowElementInstance、It.IsAny())
.回拨(
(workflowInstanceId、elementDetails、resultMessages)=>
{
添加(新的NotificationMessage(“发生错误!”,MessageSeverity.Error));
});
var控制器=新的WorkflowElementController(mockWebApiBusinessObject.Object);
var结果=controller.UpdateWorkflowElement(workflowElementModel);
Assert.AreEqual(“发生错误!”,result.Content.ReadAsStringAsync().result);
}
试验方法:

[HttpPost]
    [ActionName("UpdateWorkflowElement")]
    public HttpResponseMessage UpdateWorkflowElement(WorkflowElementModel workflowElementModel)
    {
        if (!ModelState.IsValid || workflowElementModel == null)
        {
            return new HttpResponseMessage(HttpStatusCode.BadRequest);
        }

        var response = new HttpResponseMessage(HttpStatusCode.OK);
        string responseMessage;

        if (workflowElementModel.RefTime == DateTime.MinValue)
        {
            workflowElementModel.RefTime = DateTime.UtcNow;
        }

        var resultMessages = new List<NotificationMessage>();
        var instanceId = new Guid();

        if (string.IsNullOrWhiteSpace(workflowElementModel.WorkflowInstanceId) ||
            string.IsNullOrWhiteSpace(workflowElementModel.ElementName))
        {
            responseMessage = "WorkflowInstanceId or ElementName are null or empty";
        }
        else if (!Guid.TryParse(workflowElementModel.WorkflowInstanceId, out instanceId))
        {
            responseMessage = "WorkflowInstanceId is not a valid Guid";
        }
        else
        {
            var element = new WorkflowElementInstance
            {
                ElementName = workflowElementModel.ElementName,
                RefTime = workflowElementModel.RefTime,
                SummaryDescription = workflowElementModel.SummaryDescription ?? "",
                FullDescription = workflowElementModel.FullDescription ?? ""
            };

            _webApiBusinessObject.UpdateWorkflowInstanceState(instanceId, element, resultMessages);

            responseMessage = "Element Updated";
        }

        if (NotificationMessage.HasErrors(resultMessages))
        {
            responseMessage = resultMessages.Find(m => m.Status == MessageSeverity.Error).Message;
        }

        response.Content = new StringContent(responseMessage);
        return response;
    }
[HttpPost]
[ActionName(“UpdateWorkflowElement”)]
公共HttpResponseMessageUpdateWorkflowElement(WorkflowElementModel WorkflowElementModel)
{
如果(!ModelState.IsValid | | workflowElementModel==null)
{
返回新的HttpResponseMessage(HttpStatusCode.BadRequest);
}
var响应=新的HttpResponseMessage(HttpStatusCode.OK);
字符串响应消息;
if(workflowElementModel.RefTime==DateTime.MinValue)
{
workflowElementModel.RefTime=DateTime.UtcNow;
}
var resultMessages=新列表();
var instanceId=新Guid();
if(string.IsNullOrWhiteSpace(workflowElementModel.WorkflowInstanceId)||
string.IsNullOrWhiteSpace(workflowElementModel.ElementName))
{
responseMessage=“WorkflowInstanceId或ElementName为null或空”;
}
else如果(!Guid.TryParse(workflowElementModel.WorkflowInstanceId,out instanceId))
{
responseMessage=“WorkflowInstanceId不是有效的Guid”;
}
其他的
{
var element=新的WorkflowElementInstance
{
ElementName=workflowElementModel.ElementName,
RefTime=workflowElementModel.RefTime,
SummaryDescription=workflowElementModel.SummaryDescription???“”,
FullDescription=workflowElementModel.FullDescription??“”
};
_UpdateWorkflowInstanceState(instanceId、元素、结果消息);
responseMessage=“元素已更新”;
}
if(NotificationMessage.HasErrors(resultMessages))
{
responseMessage=resultMessages.Find(m=>m.Status==MessageSeverity.Error);
}
response.Content=新字符串内容(responseMessage);
返回响应;
}

对于3个参数,它不起作用,因为您混合了表达式参数类型

It.IsAny<List<NotificationMessage>>()
It.IsAny()
在设置中,根据

IList<NotificationMessage>
IList
在回调参数中

这意味着安装表达式参数与回调表达式参数不匹配,因此不会调用回调

坚持使用一种类型,因此可以同时使用
列表

您还在测试中的方法中创建参数的新实例,该实例与安装中使用的实例不同。这就是回电不起作用的原因。为了证明这一点。对所有参数使用
It.IsAny()
,它应该可以工作

mockWebApiBusinessObject
    .Setup(m => m.UpdateWorkflowInstanceState(It.IsAny<Guid>(), It.IsAny<WorkflowElementInstance>(), It.IsAny<List<NotificationMessage>>()))
    .Callback<Guid, WorkflowElementInstance, List<NotificationMessage>>(
                (workflowInstanceId, elementDetails, resultMessages) =>
                {
                    resultMessages.Add(new NotificationMessage("An Error Occured!", MessageSeverity.Error));
                });
mockWebApiBusinessObject
.Setup(m=>m.UpdateWorkflowInstanceState(It.IsAny()、It.IsAny()、It.IsAny())
.回拨(
(workflowInstanceId、elementDetails、resultMessages)=>
{
添加(新的NotificationMessage(“发生错误!”,MessageSeverity.Error));
});
或者更通用的接口

mockWebApiBusinessObject
    .Setup(m => m.UpdateWorkflowInstanceState(It.IsAny<Guid>(), It.IsAny<WorkflowElementInstance>(), It.IsAny<IList<NotificationMessage>>()))
    .Callback<Guid, WorkflowElementInstance, IList<NotificationMessage>>(
                (workflowInstanceId, elementDetails, resultMessages) =>
                {
                    resultMessages.Add(new NotificationMessage("An Error Occured!", MessageSeverity.Error));
                });
mockWebApiBusinessObject
.Setup(m=>m.UpdateWorkflowInstanceState(It.IsAny()、It.IsAny()、It.IsAny())
.回拨(
(workflowInstanceId、elementDetails、resultMessages)=>
{
添加(新的NotificationMessage(“发生错误!”,MessageSeverity.Error));
});

<>你也应该花一些时间和复习来更好地理解如何使用嘲讽框架。

< P>请考虑在单元测试中的次要位置更新。 在模拟之前添加
iWebAPI业务对象
对象:

 List<NotificationMessage> messages = new List<NotificationMessage>();
并且需要将源代码方法
UpdateWorkflowElement(WorkflowElementModel model)
更新为

UpdateWorkflowElement(WorkflowElementModel model, List<NotificationMessage> messages);
var result = controller.UpdateWorkflowElement(workflowElementModel, messages);
如果我正确理解了您的
UpdateWorkflowInstanceState()
方法, 然后您将使用
IWebApiBusinessObject
调用
UpdateWor
var result = controller.UpdateWorkflowElement(workflowElementModel, messages);