Moq WebApi异步方法

时间:2016-12-08 14:51:01

标签: c# unit-testing asp.net-web-api moq

我刚接触Moq测试,所以我对ReturnsAsync感到困惑。 这是我的测试方法,我期望ReturnsAsync应该接收将由Setup中定义的方法返回的类型。我是对的吗?

但似乎ReturnsAsync应该有另一个签名 - 它正在寻找Func委托。

[TestClass]
public class TourObjectControllerTest
{
    [TestMethod]
    public async Task GetTourObjects()
    {
        var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
        mockService.Setup(x => x.GetAll()).ReturnsAsync(new Task<IEnumerable<TourObjectDTO>>);
        var controller = new TourObjectController(mockService.Object);
        var result = await controller.Get();
        Assert.IsNotNull(result);
        Assert.AreSame(typeof(TourObjectViewModel), result);
    }
}

待测方法:

public async Task<IEnumerable<TourObjectViewModel>> Get()
{
    IEnumerable<TourObjectViewModel> viewmodel = null;
    try
    {
        var tourobjects = await _tos.GetAll();
        viewmodel = Mapper.Map<IEnumerable<TourObjectViewModel>>(tourobjects);
    }
    catch (Exception ex)
    {
        Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
    }
    return viewmodel;
}

2 个答案:

答案 0 :(得分:1)

Task<TReurnValue>应该将返回值作为参数而不是mockService.Setup(x => x.GetAll()).ReturnsAsync(new List<TourObjectDTO>()); mockService.Setup(x => x.GetAll()).Returns(Task.FromResult(new List<TourObjectDTO>())); 。例如,接下来的两行代码是相同的(按行为):

new List<TourObjectDTO>()

您需要将var testData = new [] { new TourObjectDTO(1, "test1"), new TourObjectDTO(2, "test2") }; mockService.Setup(x => x.GetAll()).ReturnsAsync(testData); 替换为您要在模拟测试中检索的测试数据。例如,您只需创建几个测试值:

ReturnsAsync()

或根据需要创建假数据生成器。

请注意,Task<T>仅适用于返回Task的方法。对于仅返回.Returns(Task.FromResult(default(object)))的方法,可以使用{{1}}。

答案 1 :(得分:1)

传递实际结果。

假设ITourObjectService.GetAll()返回Task<IEnumerable<TourObjectDTO>>

例如

[TestClass]
public class TourObjectControllerTest
{
    [TestMethod]
    public async Task GetTourObjects()
    {
        var fakeData = new List<TourObjectDTO>() {
            new TourObjectDTO { ... }
        };
        var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
        mockService.Setup(x => x.GetAll()).ReturnsAsync(fakeData);
        var controller = new TourObjectController(mockService.Object);
        var result = await controller.Get();
        Assert.IsNotNull(result);
        Assert.IsTry(typeof(IEnumerable<TourObjectViewModel>).IsAssignableFrom(result.GetType());
    }
}