为什么该方法不起作用,但是另一种方法中的相同算法有效?



我有一个带有实体框架的数据库,使用存储库设计模式。我的存储库中有一个方法,它获取两个输入,一个实体和一个IQuerable<Entity>集合。方法算法应根据实体输入从集合中返回另一个实体(为简单起见,想象一个约会应用,其中用户 A 根据用户 A 的首选项获取用户 B 作为推荐(。

我有一个测试类库,用于使用 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...
}

好吧,我终于想出了解决这个问题的方法。当我将我的 Mock 声明为private Mock<IUserRepository> userRepo = new Mock<IUserRepository>();然后将存储库声明为IUserRepository Repo = userRepo.Object;时,当我调用Repo.SearchForDate(IUser entity, IQuerable<USERS> users);方法时,它一直返回 null,因为 Repo 只是一个没有真正实现的接口。所以我决定将 Mock 的类型从IUserRepository更改为UserRepository和繁荣......突然间,一切都开始起作用了。无论如何,谢谢你们帮助我!:)

最新更新