C# 如何获取Moq以验证具有out参数的方法

C# 如何获取Moq以验证具有out参数的方法,c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我有一个接口定义,其中方法定义了一个out参数 public interface IRestCommunicationService { TResult PerformPost<TResult, TData>(string url, TData dataToSend, out StandardErrorResult errors); } 此错误在Setup语句中抛出 仅供参考。我正在使用Resharper 8并使用他们的测试运行程序来执行我的测试 如果我尝试将out参数添加

我有一个接口定义,其中方法定义了一个out参数

public interface IRestCommunicationService
{
    TResult PerformPost<TResult, TData>(string url, TData dataToSend, out StandardErrorResult errors);
}
此错误在Setup语句中抛出

仅供参考。我正在使用Resharper 8并使用他们的测试运行程序来执行我的测试

如果我尝试将out参数添加到回调中,代码将无法编译

如果我将设置修改为

_mockRestCommunicationService.Setup(x => x.PerformPost<string, PostAlertModel>(
It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors))
.Callback
    ((string s, PostAlertModel m, StandardErrorResult e) => e.Errors = new System.Collections.Generic.List<StandardError>()
        {
            new StandardError { ErrorCode = "Code", ErrorMessage = "Message" }
        });
\u mockRestCommunicationService.Setup(x=>x.PerformPost(
It.IsAny(),It.IsAny(),out()
.回拨
((字符串s,PostAlertModel m,StandardErrorResult e)=>e.Errors=new System.Collections.Generic.List()
{
新标准错误{ErrorCode=“Code”,ErrorMessage=“Message”}
});

最好实际使用而不是验证模拟。设置方法以返回某些特定结果并断言已返回结果:

var myCommResult = new PostAlertModel();
_mockEestCommunicationService
    .Setup(x => x.PerformPost<string, PostAlertModel>(It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors)
    .Returns(myCommResult);

var response = _systemUnderTest.CreateTrip(consumerNumber, trip, out apiErrors);

Assert.AreSame(myCommResult, response);
var myCommResult=new PostAlertModel();
_模拟通信服务
.Setup(x=>x.PerformPost(It.IsAny()、It.IsAny()、out-apirors)
。返回(结果);
var响应=_systemUnderTest.CreateTrip(消费者编号、trip、out APIRERRORS);
arame(myCommResult,response);
上面将根据示例代码验证是否调用了该方法

如果出于某种原因,问题中的代码不能真正代表真正的代码,并且无法在方法返回时断言,那么您可以使用回调,并在错误中添加一些内容,以便进行验证

比如:

_mockEestCommunicationService
   .Setup(x => x.PerformPost<string, PostAlertModel>(It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors))
   .Callback( (string s, PostAlertModel m, StandardErrorResult e) => e.Add("Some error to test");
\u模拟通信服务
.Setup(x=>x.PerformPost(It.IsAny(),It.IsAny(),out-apirors))
.Callback((字符串s,PostAlertModel m,StandardErrorResult e)=>e.Add(“要测试的一些错误”);

然后验证apiErrors是否具有您在回调中插入的错误。

我尝试使用回调,但现在我收到以下错误消息:无效回调。使用参数的方法上的安装程序无法使用参数调用回调。我也尝试使用泛型方法调用。回调(s,m,e)你能发布准确的异常消息吗?如果应该包含预期的参数以及你设置的参数。
var consumerNumber = ...
var trip = ...
var result = ...
StandardErrorResult apiErrors;
_mockRestCommunicationService.Setup(x => x.PerformPost<string, PostAlertModel>(
            It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors))
    .Callback<string, PostAlertModel, StandardErrorResult>
    ((s, m, e) => e.Errors = new System.Collections.Generic.List<StandardError>()
    {
        new StandardError { ErrorCode = "Code", ErrorMessage = "Message" }
    });

_systemUnderTest.CreateTrip(consumerNumber, trip, out apiErrors);
Assert.That(apiErrors.Errors, Is.Not.Null);
System.ArgumentException : Invalid callback. Setup on method with 
parameters (String,PostAlertModel,StandardErrorResult&) 
cannot invoke callback with parameters (String,PostAlertModel,StandardErrorResult).
   at Moq.MethodCall.ThrowParameterMismatch(ParameterInfo[] expected, ParameterInfo[] actual)
   at Moq.MethodCall.SetCallbackWithArguments(Delegate callback)
   at Moq.MethodCallReturn`2.Callback(Action`3 callback)
_mockRestCommunicationService.Setup(x => x.PerformPost<string, PostAlertModel>(
It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors))
.Callback
    ((string s, PostAlertModel m, StandardErrorResult e) => e.Errors = new System.Collections.Generic.List<StandardError>()
        {
            new StandardError { ErrorCode = "Code", ErrorMessage = "Message" }
        });
var myCommResult = new PostAlertModel();
_mockEestCommunicationService
    .Setup(x => x.PerformPost<string, PostAlertModel>(It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors)
    .Returns(myCommResult);

var response = _systemUnderTest.CreateTrip(consumerNumber, trip, out apiErrors);

Assert.AreSame(myCommResult, response);
_mockEestCommunicationService
   .Setup(x => x.PerformPost<string, PostAlertModel>(It.IsAny<string>(), It.IsAny<PostAlertModel>(), out apiErrors))
   .Callback( (string s, PostAlertModel m, StandardErrorResult e) => e.Add("Some error to test");