我刚接触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;
}
答案 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());
}
}