模拟查询生成器

时间:2017-06-22 08:18:43

标签: c# unit-testing mocking

我创建了项目,其中包含存储库和查询存储库。每个存储库中的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中模拟所有返回方法才能使其工作?如何在没有这么多工作的情况下使其工作?

2 个答案:

答案 0 :(得分:1)

我猜方法(ByUserId,ByDateTimeRange,FilterAutomatic,ToListAsync) 是扩展方法,例如 IQuerable ByUserId(这个IQuerable事件);如果是真的你只能模拟.Query()方法返回这样的东西: 新列表{...你的数据......} .AsQuerable();

答案 1 :(得分:1)

我找到了解决方案。 Moq提供方法SetReturnsDefault()。所以解决方案是

  

eventQueryBuilder.SetReturnsDefault(eventQueryBuilder.Object);