NUnit / Moq выдает ошибку NullReferenceException в конструктор переменной - PullRequest
0 голосов
/ 05 октября 2011

Я использую Moq, NUnit, WPF, MVVM, Ninject.

Я пишу тест для моего LoginViewModel, и в тесте, когда я использую конструктор LoginViewModel для создания нового экземпляра, я получаю ошибку NullReferenceException. Код компилируется и запускается (т.е. когда я запускаю программу, которую показывает LoginView, и работает с LoginViewModel для создания правильного поведения и т. Д.), Но по какой-то причине происходит сбой UnitTest.

это конструктор:

public LoginViewModel(ILoginServices loginServices,IDialogService dialogServices)
{
            InitializeFields();
            _loginServices = loginServices;
            _dialogService = dialogServices;
            DomainList = _loginServices.GetDomainListing();

}

Я смоделировал зависимости следующим образом:

Mock<ILoginServices> moq = new Mock<ILoginServices>();
 moq.Setup(log =>
           log.LoginUser(It.IsAny<string>(), 
                         It.IsAny<string>(), 
                         It.IsAny<string>()))
           .Callback<string, string, string>((i, j, k) => CheckArgs(i, j, k));

 moq.Setup(log2 =>
           log2.GetDomainListing()).Returns(new List<string> { "Domain" });

 Mock<IDialogService> moq2 = new Mock<IDialogService>();
  • Я также пытался вставить реальные службы в качестве параметров.
  • Я проверил, что макеты работают, и объекты эти макеты возврат не нулевой.
  • Я закомментировал весь код в конструкторе.
  • Я попытался вставить строку

    LoginViewModel test = new LoginViewModel (_fakeLoginService, _fakeDialogService);

    перед вызовом конструктора (чтобы увидеть, имеет ли это отношение к исходной локальной переменной, расположенной или чем-то еще), и вместо этого эта строка вылетела.

Из всего, что я могу видеть, это должен быть конструктор (но не код, который я написал внутри него), и что это связано исключительно с NUnit / Moq, так как мой код все еще компилируется и работает нормально.

Я понятия не имею, парни, кто-нибудь может указать мне правильное направление?


[Редактировать]

Хорошо, я выполнил код, и в этой строке кода появляется ошибка:

ImageSource = (ImageSource)Application.Current.FindResource(_imageName);

Этот код отправляется в ImageDictionary и получает ссылку на изображение для кнопки отмены в WindowViewModel (которую наследует мой LoginViewModel).

Мои предположения относительно того, почему он работает при нормальном запуске приложения, а не при тестировании:

1) Поскольку я запускаю программный код через NUnit, объект Application.Current не получает назначенное свойство / нет объекта Application.Current, который нужно получить.

                                  **or**

2) Что-то, что связано с тем, что, поскольку программный код запускается в NUnit, у кода нет доступа к / невозможно разрешить ImageDictionary для поиска изображения.

Я сильнее склоняюсь к первой гипотезе, но пока еще не уверен на 100%, и у меня возникают проблемы с поиском значений Application.Current во время выполнения, потому что, когда я перемещаю курсор над закройте всплывающую подсказку, отображающую детали объекта, который не появляется.

Мой новый вопрос: имеет ли это смысл? Ребята, вы знаете, существует ли / доступен объект Application.Current при запуске проекта тестирования через NUnit?

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 октября 2011

Вы правы.Application.Current ноль для юнит-тестов.Вы можете обойти это, вставив объект Application , так как ссылки на одиночные символы в коде могут усложнить жизнь.

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