使用MVVM Light& amp;进行单元测试DispatcherHelper

时间:2011-01-17 19:16:56

标签: silverlight unit-testing mvvm-light

我有一个使用MVVM Light Toolkit的SL4应用程序。在视图模型中,我调用一个从OData服务检索数据的数据服务。在VM中,我使用DispatcherHelper实用程序类(MVVM Light的一部分)从我传递给数据服务的回调中的数据更新VM上的属性。例如,我的视图模型方法如下所示:

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。我假设它与initlization有关(在我的SL应用程序的Application_Startup()中)。我尝试在我的测试应用程序中初始化它,但这没有帮助。我也尝试过使用DispatcherHelper.CheckBeginInvokeOnUI(),但这对问题没有影响。

想法?

1 个答案:

答案 0 :(得分:4)

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;”上设置了一个断点。它击中了断点。这会解决您的问题吗? (如果是,请将其标记为答案)。