【发布时间】:2022-01-27 06:00:00
【问题描述】:
这是我到目前为止的第一个问题,如果描述得不是很好,请原谅,但我会尽力而为。
我正在使用 Moq 在单元测试中模拟我的服务层以进行后 api 调用,并且 _service.Create(...) 返回一个元组值:
Task<(Model.Receipt Receipt, bool IsIdempotent)>
为此,我创建了一个元组结果并作为 ReturnsAsync 传递,如下所示:
var input = JsonConvert.DeserializeObject<Model.Receipt>(_jsonReceiptString);
var output = (Receipt: input, IsIdempotent: true);
_service.Setup(x => x.CreateAsync(input)).ReturnsAsync(output);
到这里一切正常,但在运行时,在 Post 调用中调用服务后,返回值为<null,false>!!!
这听起来像是返回一个默认值而不是预期的元组。由于我在此模拟之后记录了数据,这会导致单元测试失败。
如果我在这里遗漏了什么,你知道吗?
【问题讨论】:
-
你能把你的测试正在测试的代码贴出来吗?
-
我很确定
Model.Receipt是一个类并且没有Equals重载。 -
作为一个实验,将
_service.Setup(x => x.CreateAsync(input)).ReturnsAsync(output);更改为_service.Setup(x => x.CreateAsync(It.IsAny<Model.Receipt>)).ReturnsAsync(output);如果它有效,则说明在原始代码中,您的设置期望使用Model.Receipt的相同实例调用该方法.您可以更改您的测试以确保将相同的实例传递给该方法,或者将您的Setup更改为使用It.Is<Model.Receipt>(...function that checks to see if the argument matches some criteria...); -
@ScottHannen 哦,成功了!谢谢...您是说 _service.CreateAsync 期望输入为 API?因为我为此使用自动映射器?是这个原因吗?这是实际的 GET 方法 var data = await _service.CreateAsync(_mapper.Map
(request)); -
这是因为在原始版本中它期望相同的类实例。现在您可以使用
It.Is检查传递给函数的Receipt。如果您更新问题以显示您想要检查的属性或Receipt中的一些,那么我可以将其余部分放在答案中。换句话说,Receipt需要具有哪些值才能让您知道它是正确的并且测试应该通过?
标签: c# asp.net-web-api nunit moq .net-6.0