我有一份工作,我有一个IDisposable DbContext.我想在没有进入数据库的情况下对这项工作进行单元测试.我有什么选择呢?
我正在使用微软的默认Fakes程序集.
我的工作:
public void Work() { do { //code here using (var repository = new Repository<User>()) { repository.Save(user); } } while (true); }
我正在尝试测试并且在测试的这一部分中它失败了,因为它实际上创建了一个Repository类的新实例.
我的测试方法:
using (ShimsContext.Create()) { Data.Repository.Fakes.ShimRepository<Domain.Fakes.ShimUser>.Constructor = (a) => { }; Data.Repository.Fakes.ShimRepository<Domain.Fakes.ShimUser>.AllInstances.SaveT0 = (a,b) => { }; var service = GetService(); service.Work(); //Throws exception }
我怎么能伪造这个Save方法?
解决方法
你在这里违反了
DIP,使得对你的服务进行单元测试的难度远远超过应有的水平.您还应该避免使用通用存储库并支持
role interfaces.
相反,将抽象注入您的存储库服务,例如IUsersRepository定义了您的Save方法.然后在您对服务的单元测试中,您可以简单地使用IUsersRepository的存根实现.