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

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... 突然一切都开始工作了。无论如何,谢谢你们帮助我! :)