Moq不包含ReturnAsync的定义?

时间:2018-06-22 14:46:21

标签: c# .net unit-testing moq

我正在尝试模拟一些对第三方服务的API调用,以进行单元测试。我真的只是希望这个模拟函数每次都返回相同的RestEase.Response<...>

// Setup
var VeracrossMock = new Mock<IVeracrossAPI>(MockBehavior.Strict);
Func<List<VeracrossStudent>> func = () => new List<VeracrossStudent>() { new VeracrossStudent() { First_name = "Bob", Last_name = "Lob" } };
RestEase.Response<List<VeracrossStudent>> resp = new RestEase.Response<List<VeracrossStudent>>("", new HttpResponseMessage(HttpStatusCode.OK), func);

// Problem is on the line below
VeracrossMock.Setup(api => api.GetStudentsAsync(1, null, CancellationToken.None)).ReturnsAsync<RestEase.Response<List<VeracrossStudent>>>(resp);

它给我一个红色的下划线,然后声称ReturnsAsync不存在,或者至少不包含我给出的参数。

Error CS1929 'ISetup<IVeracrossAPI, Task<Response<List<VeracrossStudent>>>>' does not contain a definition for 'ReturnsAsync' and the best extension method overload 'SequenceExtensions.ReturnsAsync<Response<List<VeracrossStudent>>>(ISetupSequentialResult<Task<Response<List<VeracrossStudent>>>>, Response<List<VeracrossStudent>>)' requires a receiver of type 'ISetupSequentialResult<Task<Response<List<VeracrossStudent>>>>'

我应该如何使用ReturnsAsync?对于如何嘲弄它一无所知。

3 个答案:

答案 0 :(得分:3)

正在使用的通用参数与被模拟成员的参数不匹配。

删除通用参数

VeracrossMock
    .Setup(_ => _.GetStudentsAsync(1, null, CancellationToken.None))
    .ReturnsAsync(resp);

,该方法将根据被模拟的成员来推断所需的通用参数。

答案 1 :(得分:1)

此错误的另一个选择是因为 ReturnsAsync 仅可用于返回 Task<T> 的方法。对于仅返回 Task 的方法,可以使用以下任一选项:

mock.Setup(arg=>arg.DoSomethingAsync()).Returns(Task.FromResult(default(object)))


mock.Setup(arg=>arg.DoSomethingAsync()).Returns(Task.CompletedTask);

答案 2 :(得分:0)

在过去的几周中,我多次遇到此错误消息,并忘记了如何修复它,因此我在这里写它,希望对您有所帮助。每次是因为我很笨并且在设置方法时传递对象/类型时,都期望对象/类型的列表

相关问题