silverlight - 使用 MVVM Light 和 DispatcherHelper 进行单元测试

标签 silverlight unit-testing mvvm-light

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

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 单元测试框架针对它编写单元测试时。我可以毫无问题地测试我的数据服务,但 DispatcherHelper 似乎在我的所有测试中投入了 Spanner ,因为 DispatcherHelper.UIDispatcher 在触发时始终为空。我假设它与初始化(在我的 SL 应用程序的 Application_Startup() 中)有关。我尝试在我的测试应用程序中初始化它,但这没有帮助。我也试过使用 DispatcherHelper.CheckBeginInvokeOnUI() 但这对问题没有影响。

想法?

最佳答案

交流电,

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

关于silverlight - 使用 MVVM Light 和 DispatcherHelper 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4716913/

相关文章:

unit-testing - 集成和单元测试之间的 Grails 污染

Javascript 最佳实践

c# - ListBox 复选框命令绑定(bind)

c# - INotifyPropertyChanged 'Double' 绑定(bind)

c# - MVVM Light-命令和ListView的事件-SelectedItem

c# - UserControl 使用的内存是否存储在堆中?

c# - callBack 方法是在赋值前调用的还是赋值后调用的?

c# - Silverlight、DataTemplate、绑定(bind)到点击事件

c# - WP7动态更新UI而不阻塞线程

unit-testing - 单元测试D库