我有一个使用实体库设计模式的带有实体框架的数据库。我的存储库中有一个方法可以获取两个输入,一个实体和一个IQuerable<Entity>
集合。该方法算法应基于实体输入(从简单性出发,考虑一个约会应用,其中userA根据userA的偏好将userB作为推荐对象),从集合中返回另一个实体。
我有一个测试类库,用于使用nUnit和MOQ来测试存储库。我正确设置了模拟,以返回伪造的用户列表。然后我测试了该方法。
这是曲折。单元测试失败,因为存储库方法返回null。但是,如果我将算法直接复制并粘贴到单元测试中,它将返回正确的数据。怎么了?那怎么可能?在下面的代码中,我评论了对与错...
存储库方法:
public IUser SearchForDate(IUser entity, IQueryable<USERS> users)
{
var userPartner = users.Where(x => x.Interested == entity.Male)
.Where(x => x.MinAge < entity.Age)
.Where(x => x.MaxAge > entity.Age)
.Where(x => x.WantToDate == true).FirstOrDefault();
return userPartner;
}
设置时:
this.userRepo.Setup(x => x.GetAllIUsers()).Returns(testUsers);
this.userRepo.Setup(x => x.GetAll()).Returns(testUsers2.AsQueryable());
IUserRepository Repo = this.userRepo.Object;
在单元测试中:
[TestCase("Andrew", "Angela")]
public void SearchForPartner_ReturnsTheCorrectPartner(string userName, string partnerName)
{
//Assert - Act
var users = Repo.GetAll();
var userNeedsPartner = users.Single(x => x.Nickname == userName); //this return the correct user - Andrew
var partner = Repo.SearchForDate(userNeedsPartner, Repo.GetAll()); //NOT GOOD, WHY????Even if I use users instead of Repo.GetAll() - this mothafucka returns null.
var partnerForUser = Repo.GetAll().Where(x => x.Interested == userNeedsPartner.Male)
.Where(x => x.MinAge < userNeedsPartner.Age)
.Where(x => x.MaxAge > userNeedsPartner.Age)
.Where(x => x.WantToDate == true).FirstOrDefault(); //GOOD, WHY??? - This returns the correct user - Angela
//Arrange
Assert.That(partner.Nickname, Is.EqualTo(partnerName)); //NULLReferenceException...
}
答案 0 :(得分:0)
好吧,我终于找到了解决方案。当我将Mock声明为private Mock<IUserRepository> userRepo = new Mock<IUserRepository>();
,然后将存储库声明为IUserRepository Repo = userRepo.Object;
时,当我调用Repo.SearchForDate(IUser entity, IQuerable<USERS> users);
方法时,它一直都返回null,因为Repo只是一个没有实数的接口实施。因此,我决定将Mock的类型从IUserRepository
更改为UserRepository
并开始繁荣...突然,所有这些开始起作用。无论如何,谢谢大家对我的帮助! :)