为什么该方法不起作用,但另一种方法中的相同算法有效?
Why the method doesn't work, however the same algorithm in another method works?
我有一个 Entity Framework 的数据库,使用存储库设计模式。我的存储库中有一个方法可以获取两个输入,一个实体和一个 IQuerable<Entity>
集合。方法算法应该 return 集合中的另一个实体,基于实体输入(为简单起见,想象一个约会应用程序,其中用户 A 根据用户 A 的偏好获得用户 B 作为推荐)。
我有一个测试 class 库用于测试存储库,使用 nUnit 和 MOQ。我将模拟正确设置为 return 虚假用户列表。然后我测试了这个方法。
这是一个转折点。单元测试失败,因为存储库方法 return 为空。但是,如果我将算法直接复制并粘贴到单元测试中,它 return 就是正确的数据。怎么了?这怎么可能?在下面的代码中,我评论了正确和错误的东西...
存储库方法:
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
和 boom... 突然一切都开始工作了。无论如何,谢谢你们帮助我! :)
我有一个 Entity Framework 的数据库,使用存储库设计模式。我的存储库中有一个方法可以获取两个输入,一个实体和一个 IQuerable<Entity>
集合。方法算法应该 return 集合中的另一个实体,基于实体输入(为简单起见,想象一个约会应用程序,其中用户 A 根据用户 A 的偏好获得用户 B 作为推荐)。
我有一个测试 class 库用于测试存储库,使用 nUnit 和 MOQ。我将模拟正确设置为 return 虚假用户列表。然后我测试了这个方法。
这是一个转折点。单元测试失败,因为存储库方法 return 为空。但是,如果我将算法直接复制并粘贴到单元测试中,它 return 就是正确的数据。怎么了?这怎么可能?在下面的代码中,我评论了正确和错误的东西...
存储库方法:
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
和 boom... 突然一切都开始工作了。无论如何,谢谢你们帮助我! :)