Почему метод Moq-mocked возвратил null?

Мне нужна помощь с методом testmethod im, пытающимся написать...

Мне нужно проверить, что пользователь может показать свой профиль, однако я сталкиваюсь с ошибкой, когда пытаюсь использовать мой издеваемый метод GetProfileFromUserName. Методы возвращают значение null. Я не понимаю, что у меня есть аналогичный метод с именем GetEmail, который в основном делает то же самое и работает.

Это код для получения профиля, который не работает:

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName)).Returns(new Profile { ProfileID = userProfile.ProfileID });

И это код для поиска электронной почты, который работает.

mockUserRepository.Setup(em => em.GetEmail(new MockIdentity("JohnDoe").Name)).Returns("[email protected]");

И это фрагмент метода, который moker вызывает и возвращает значение null вместо профиля:

public ActionResult ShowProfile()
    {
        var profile = _userRepository.GetProfileFromUserName(User.Identity.Name);

Что я делаю неправильно? Если я заменил userProfile.UserName в GetProfileFromUserName на It.IsAny();

Ответ 1

Если он возвращает null, это означает, что ваш Setup не соответствует фактическому вызову. Убедитесь, что userProfile.UserName содержит правильное значение в строке настройки.

Кроме того, чтобы обнаружить непревзойденные вызовы, создайте mockUserRepository с помощью параметра MockBehavior.Strict.

Надеюсь, что это поможет.

Ответ 2

Для тех, кто пытается вернуть объект, который не существует во время тестовой настройки ( "Упорядочить" ), решение должно использовать перегрузку делегата (Func < > ):

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName))
     .Returns(() => new Profile { ProfileID = userProfile.ProfileID });

Ответ 3

В моем случае ошибка заключалась в инициализации объекта с неправильной подписью даже при компиляции кода:

Неверно (тип параметра - int):

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int>())).Returns(new List<Entity>());

Правильно (тип параметра - int?):

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int?>())).Returns(new List<Entity>());

Подтвержденная подпись метода:

public IList<Entity> GetEntities(int? parentEntityId)