Модульное тестирование с помощью MVVM Light & DispatcherHelper - PullRequest
4 голосов
/ 17 января 2011

У меня есть приложение SL4, которое использует MVVM Light Toolkit.В рамках модели представления я вызываю службу данных, которая извлекает данные из службы OData.В виртуальной машине я использую служебный класс DispatcherHelper (часть MVVM Light) для обновления свойства виртуальной машины из данных обратного вызова, которые я передаю в службу данных.Например, мой метод модели представления выглядит следующим образом:

public string CurrentUserLogin {
  get {
    if (string.IsNullOrEmpty(_currentUserLogin))
      RetrieveCurrentUserLogin();
    return string.IsNullOrEmpty(_currentUserLogin) ? _currentUserLogin : _currentUserLogin.Replace(@"\\", @"\");
  }
  set {
    if (_currentUserLogin != value) {
      _currentUserLogin = value;
      RaisePropertyChanged(CurrentUserLoginPropertyName);
    }
  }
}

private void RetrieveCurrentUserLogin() {
  DataService.GetCurrentUserLogin(result => {
    DispatcherHelper.UIDispatcher.BeginInvoke(() => {
      CurrentUserLogin = result;
    });
  });
}

И вот как выглядит моя служба данных:

public void GetCurrentUserLogin(Action<string> callback) {
  // create query request
  var query = OnDemandContext.CreateQuery<string>("GetCurrentUserLogin");
  var request = (HttpWebRequest)WebRequest.Create(query.RequestUri);
  request.BeginGetResponse(asyncResult => {
    var responseStream = request.EndGetResponse(asyncResult).GetResponseStream();
    var responseDocument = XDocument.Load(responseStream);
    callback(responseDocument.Root.Value);
  }, null);
}

Все отлично работает, когда я запускаю свое приложение SL.Однако у меня возникает проблема, когда я пытаюсь написать модульные тесты с использованием SL Unit Testing Framework.Я могу проверить свою службу данных без проблем, но кажется, что DispatcherHelper бросает гаечный ключ во все мои тесты, так как DispatcherHelper.UIDispatcher всегда имеет значение null при запуске.Я предполагаю, что это как-то связано с инициализацией (которая находится в Application_Startup () моего SL-приложения.Я попытался инициализировать его в моем тестовом приложении, но это не помогает.Я также пытался использовать DispatcherHelper.CheckBeginInvokeOnUI (), но это не влияет на проблему.

Идеи?

1 Ответ

4 голосов
/ 18 января 2011

AC,

Я только что создал простой проект SL UT и сделал это в App.XAML.CS

private void Application_Startup(object sender, StartupEventArgs e)
{
  RootVisual = UnitTestSystem.CreateTestPage();
  DispatcherHelper.Initialize();
}

Затем я установил это как тест (в файле tests.cs):

[TestMethod]
public void TestMethod1()
{
   Assert.IsNotNull(DispatcherHelper.UIDispatcher, "UI Dispatcher should not be null");

   DispatcherHelper.CheckBeginInvokeOnUI(() =>
   {
       // Do nothing
       var x = 1;
   });
}

Это сработало для меня. Я даже установил точку останова на "var x = 1;" и это достигло точки останова. Решает ли это вашу проблему? (если так, отметьте это как ответ).

...