sks*_*sks 1 c# unit-testing moq
我正在使用下面的代码。我对其他方法使用相同的方法,它工作正常。这里IExportJobAdapter 被模拟的适配器方法应该返回布尔类型值的任务。
从代码中我期望获得真正的价值,但我从我的模拟方法中得到了错误。在控制器内部,我调用了IExportJobAadapter返回 false的模拟方法。我从堆栈溢出中尝试了很多东西,但无法解决。我想重复一遍,只有在返回 bool 方法的情况下才会发生这种情况。所有其他地方我都使用相同的方法并且工作正常。
var controller = mocker.CreateInstance<ExportJobController>();
Run Code Online (Sandbox Code Playgroud)
模拟适配器方法
mocker.GetMock<IExportJobAdapter>()
.Setup(x => x.CreateExportJob(null))
.Returns(Task.FromResult(true));
// Act
var result = await controller.CreateExportJob(new ExportJobRequest { ProfileId = profileId, Request = request,DttmCreated= dttmCreated });
Run Code Online (Sandbox Code Playgroud)
如果您的模拟中的 Setup 方法与您正在测试的代码没有相同的参数,则模拟将与调用不匹配,您将获得预期响应的默认值,在这种情况下,布尔值的默认值是false-这就是你所看到的。
如果您希望模拟返回指定的值,那么您需要告诉安装程序接受参数的任何值:
mocker.GetMock<IExportJobAdapter>()
.Setup(x => x.CreateExportJob(It.IsAny<ExportJobRequest>()))
.Returns(Task.FromResult(true));
Run Code Online (Sandbox Code Playgroud)
在您的示例中,我假设该方法CreateExportJob采用ExportJobRequest. 所以当上面的模拟被调用时,它会忽略作为参数传递给CreateExportJob并返回的内容true。
除此之外,您可以使用.ReturnsAsync模拟的方法来消除调用的需要Task.FromResult:
mocker.GetMock<IExportJobAdapter>()
.Setup(x => x.CreateExportJob(It.IsAny<ExportJobRequest>()))
.ReturnsAsync(true);
Run Code Online (Sandbox Code Playgroud)
有关如何使用模拟库的更多信息,请参考Moq 快速入门。