Почему метод 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)