我创建了项目,其中包含存储库和查询存储库。每个存储库中的Query()方法都会返回IQueryBuilder来做事。
我在User类中有如下方法:
public class User
{
//...
public async Task<State> GetCurrentState(IEventRepository entRepository)
{
var lastWorkdayWeekEvents = await eventRepository.Query()
.ByUserId(this.Id).ByDateTimeRange(DateTime.UtcNow.AddDays(-3),
DateTime.UtcNow.AddDays(1)).FilterAutomatic().
ToListAsync();
//return ...
}
}
我想测试一下这个方法。我很想用Moq。我想模拟ToListAsync()方法。
[Fact]
public async void GetCurrentState()
{
//arrage
var lastEvents = new Task<List<Event>>(() => new List<Event>
{
new Event{ActivityId = ActivityId.BoxesIn, Address = new Address{Id = 99}}
});
var eventRepository = new Mock<IEventRepository>().Object;
var eventQueryBuilder = new Mock<IEventQueryBuilder>().Setup(x => x.ToListAsync()).Returns(() => lastEvents);
var user = new User();
var result = await user.GetCurrentState(eventRepository);
//...
}
我得到null引用,因为eventRepository.Query()返回null。我是否必须从QueryRepository中模拟所有返回方法才能使其工作?如何在没有这么多工作的情况下使其工作?
答案 0 :(得分:1)
我猜方法(ByUserId,ByDateTimeRange,FilterAutomatic,ToListAsync) 是扩展方法,例如 IQuerable ByUserId(这个IQuerable事件);如果是真的你只能模拟.Query()方法返回这样的东西: 新列表{...你的数据......} .AsQuerable();
答案 1 :(得分:1)
我找到了解决方案。 Moq提供方法SetReturnsDefault()。所以解决方案是
eventQueryBuilder.SetReturnsDefault(eventQueryBuilder.Object);