C# moqwebapi异步方法

C# moqwebapi异步方法,c#,unit-testing,asp.net-web-api,moq,C#,Unit Testing,Asp.net Web Api,Moq,我刚开始使用Moq进行测试,所以我对ReturnsAsync有点困惑。 这是我的测试方法,我希望ReturnsAsync应该接收将由Setup中定义的方法返回的类型。我说得对吗 但是似乎ReturnsAsync应该有另一个签名-它正在寻找Func委托 [TestClass] public class TourObjectControllerTest { [TestMethod] public async Task GetTourObjects() { va

我刚开始使用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);
    }
}
[TestClass]
公共类TourObjectControllerTest
{
[测试方法]
公共异步任务GetTourObjects()
{
var mockService=new Mock(MockBehavior.Default);
mockService.Setup(x=>x.GetAll()).ReturnsAsync(新任务);
var控制器=新的TourObjectController(mockService.Object);
var result=await controller.Get();
Assert.IsNotNull(结果);
arame(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;
}
公共异步任务Get() { IEnumerable viewmodel=null; 尝试 { var tourobjects=wait_tos.GetAll(); viewmodel=Mapper.Map(tourobjects); } 捕获(例外情况除外) { ErrorFormat(“方法:{0}
错误:{1}”,System.Reflection.MethodBase.GetCurrentMethod().Name,ex); } 返回视图模型; }
ReturnsAsync()
应将返回值作为参数,而不是
Task
。例如,接下来的两行代码相等(按行为):

如果需要,也可以创建假数据生成器

请注意,
ReturnsAsync()
仅适用于返回
任务的方法。对于只返回
任务的方法,可以使用
.Returns(Task.FromResult(default(object))

传递实际结果

假设
ITourObjectService.GetAll()
返回
Task

乙二醇

[TestClass]
公共类TourObjectControllerTest
{
[测试方法]
公共异步任务GetTourObjects()
{
var fakeData=新列表(){
新TourObjectDTO{…}
};
var mockService=new Mock(MockBehavior.Default);
mockService.Setup(x=>x.GetAll()).ReturnsAsync(fakeData);
var控制器=新的TourObjectController(mockService.Object);
var result=await controller.Get();
Assert.IsNotNull(结果);
IsTry(typeof(IEnumerable).IsAssignableFrom(result.GetType());
}
}

Intellisense怎么说?(我假设您在VS中工作)@KennethK.,它说任务不能分配给FuncYes类型,方法GetAll returnTask@andrey.shedko好的,然后只需将此方法的预期值作为ReturnsAsync的参数传递,或者将Returns与Task一起使用。结果如上述代码所示。如果我错了,请更正我,Moq生成IEnumerable类型的随机数据?不,它不会。没有som时不会e extension或pluginWell,那么这是如何模拟存储库/服务行为的呢?您正在模拟服务,并提供一些虚假数据,以便在调用模拟成员时返回。测试失败,甚至出现实际结果-Assert.IsNotNull()中出错
mockService.Setup(x => x.GetAll()).ReturnsAsync(new List<TourObjectDTO>());
mockService.Setup(x => x.GetAll()).Returns(Task.FromResult(new List<TourObjectDTO>()));
var testData = new [] { new TourObjectDTO(1, "test1"), new TourObjectDTO(2, "test2") };
mockService.Setup(x => x.GetAll()).ReturnsAsync(testData);
[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());
    }
}