How can I tell Moq to return a Task?

前端 未结 4 1717
盖世英雄少女心
盖世英雄少女心 2020-11-27 09:56

I\'ve got an interface which declares

Task DoSomethingAsync();

I\'m using MoqFramework for my tests:

[TestMethod()]
public          


        
4条回答
  •  天命终不由人
    2020-11-27 10:19

    Your method doesn't have any callbacks so there is no reason to use .CallBack(). You can simply return a Task with the desired values using .Returns() and Task.FromResult, e.g.:

    MyType someValue=...;
    mock.Setup(arg=>arg.DoSomethingAsync())        
        .Returns(Task.FromResult(someValue));
    

    Update 2014-06-22

    Moq 4.2 has two new extension methods to assist with this.

    mock.Setup(arg=>arg.DoSomethingAsync())
        .ReturnsAsync(someValue);
    
    mock.Setup(arg=>arg.DoSomethingAsync())        
        .ThrowsAsync(new InvalidOperationException());
    

    Update 2016-05-05

    As Seth Flowers mentions in the other answer, ReturnsAsync is only available for methods that return a Task. For methods that return only a Task,

    .Returns(Task.FromResult(default(object)))
    

    can be used.

    As shown in this answer, in .NET 4.6 this is simplified to .Returns(Task.CompletedTask);, e.g.:

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

提交回复
热议问题