我是使用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;
}

最佳答案

通过实际结果。

假设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());
    }
}

关于c# - Moq Web Api异步方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41042255/

10-14 14:50
查看更多