【问题标题】:C# Moq method is not returning the boolean value specifiedC# Moq 方法未返回指定的布尔值
【发布时间】:2019-11-27 02:03:56
【问题描述】:

我正在使用以下代码。我对其他工作正常的方法使用相同的方法。这里IExportJobAdapter被mock的适配器方法应该返回布尔类型值的Task。

我希望从代码中获得真正的价值,但我的模拟方法却是错误的。在控制器内部,我调用了 IExportJobAadapter 的模拟方法,它返回 false。我从堆栈溢出尝试了很多事情,但无法解决。我想重复一遍,这只发生在返回 bool 方法的情况下。我在所有其他地方都使用相同的方法并且工作正常。

var controller = mocker.CreateInstance<ExportJobController>();

模拟适配器方法

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 });

【问题讨论】:

  • 需要查看被测代码。
  • 执行测试时传递给模拟的参数很可能不匹配。
  • 发布缺少minimal reproducible example... 但正如@Nkosi 所说,这很可能是由于x.CreateExportJob(null)(设置方法以在使用null 调用时返回特定值)而不是通常的x.CreateExportJob(It.IsAny&lt;ExportJobRequest&gt;())跨度>
  • 非常感谢 Nkosi 和 Alexei。我试过 x.CreateExportJob(It.IsAny()) 并且它工作得很好。
  • @sks 我在下面提供的答案中添加了一个链接。快速入门文档。您应该花点时间阅读一下,以更好地了解 Moq 的工作原理。

标签: c# unit-testing moq


【解决方案1】:

如果您的模拟中的 Setup 方法与您正在测试的代码没有相同的参数,那么模拟将与调用不匹配,您将获得预期响应的默认值,在这种情况下为布尔值是 false - 这就是您所看到的。

如果您希望模拟返回指定的值,那么您需要告诉安装程序接受参数的任何值:

mocker.GetMock<IExportJobAdapter>()
    .Setup(x => x.CreateExportJob(It.IsAny<ExportJobRequest>()))
    .Returns(Task.FromResult(true));

在您的示例中,我假设方法CreateExportJob 采用ExportJobRequest 的参数。所以当上面的 mock 被调用时,它会忽略作为参数传递给CreateExportJob 的内容并返回true

除此之外,您还可以使用 mock 的 .ReturnsAsync 方法来消除调用 Task.FromResult 的需要:

mocker.GetMock<IExportJobAdapter>()
    .Setup(x => x.CreateExportJob(It.IsAny<ExportJobRequest>()))
    .ReturnsAsync(true);

参考Moq Quickstart 了解更多关于如何使用模拟库的信息。

【讨论】:

  • 对此答案+1。如果您想真正确保传递正确的参数,这是注入对象提供者和创建者并避免使用“new”关键字的一个很好的理由。
猜你喜欢
  • 1970-01-01
  • 2012-11-03
  • 1970-01-01
  • 2015-09-10
  • 2012-11-04
  • 2015-06-18
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多