Почему метод не работает, но работает тот же алгоритм в другом методе? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть БД с 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...
}

1 Ответ

0 голосов
/ 14 октября 2019

Хорошо, я наконец нашел решение для этого. Поскольку я объявил свой Mock как private Mock<IUserRepository> userRepo = new Mock<IUserRepository>();, а затем объявил репозиторий как IUserRepository Repo = userRepo.Object;, поэтому, когда я вызывал метод Repo.SearchForDate(IUser entity, IQuerable<USERS> users);, он все время возвращал null, потому что Repo был просто интерфейсом без реальной реализации. Поэтому я решил изменить тип Mock с IUserRepository на UserRepository и бум ... Вдруг все это начало работать. В любом случае, спасибо, ребята, что помогли мне! :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...