У меня есть БД с Entity Framework, использующая шаблон проектирования хранилища. В моем репозитории есть метод, который получает два входа: сущность и коллекцию IQuerable<Entity>
. Алгоритм метода должен возвращать другую сущность из коллекции на основе входных данных сущности (для простоты представьте приложение для знакомств, в котором userA получает userB в качестве рекомендации, основываясь на предпочтениях userA).
У меня естьбиблиотека тестовых классов для тестирования репозитория, используя nUnit и MOQ. Я правильно настроил макет, чтобы вернуть поддельный список пользователей. а затем я проверил метод.
Вот поворот. Модульный тест не пройден, потому что метод репозитория возвращает ноль. Однако, если я копирую и вставляю алгоритм прямо в модульный тест, он возвращает правильные данные. В чем дело? Как это возможно? В приведенном ниже коде я прокомментировал правильные и неправильные вещи ...
Метод репозитория:
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...
}