Silverlight 使用MVVM Light&;调度员助手

Silverlight 使用MVVM Light&;调度员助手,silverlight,unit-testing,mvvm-light,Silverlight,Unit Testing,Mvvm Light,我有一个利用MVVM Light Toolkit的SL4应用程序。在视图模型中,我调用从OData服务检索数据的数据服务。在VM中,我使用DispatcherHelper实用程序类(MVVM Light的一部分)从传入数据服务的回调中的数据更新VM上的属性。例如,“我的视图模型”方法如下所示: public string CurrentUserLogin { get { if (string.IsNullOrEmpty(_currentUserLogin)) Retrie

我有一个利用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);
}
public void GetCurrentUserLogin(操作回调){
//创建查询请求
var query=OnDemandContext.CreateQuery(“GetCurrentUserLogin”);
var request=(HttpWebRequest)WebRequest.Create(query.RequestUri);
request.BeginGetResponse(asyncResult=>{
var responseStream=request.EndGetResponse(asyncResult.GetResponseStream();
var responseDocument=XDocument.Load(responseStream);
回调(responseDocument.Root.Value);
},空);
}
当我运行SL应用程序时,一切都很好。然而,我遇到的问题是,当我试图使用SL单元测试框架针对它编写单元测试时。我可以毫无问题地测试我的数据服务,但DispatcherHelper似乎在干扰我的所有测试,因为DispatcherHelper.UIDispatcher在启动时总是为null。我假设它与初始化(在我的SL应用程序的应用程序启动()中)有关。我试着在我的测试应用程序中初始化它,但没有帮助。我也尝试过使用DispatcherHelper.CheckBeginInvokeOnUI(),但这对问题没有任何影响

想法?

交流

我刚刚创建了一个简单的SL UT项目,并在App.XAML.CS中实现了这一点

private void Application_Startup(object sender, StartupEventArgs e)
{
  RootVisual = UnitTestSystem.CreateTestPage();
  DispatcherHelper.Initialize();
}
然后我将其设置为测试(在tests.cs中):


这对我很管用。我甚至在“var x=1;”上设置了一个断点,它到达了断点。这能解决你的问题吗?(如果是,请将其标记为答案)。

谢谢DevTheo,您的解决方案是有效的,但这并不是问题所在。测试项目正在另一个项目中测试视图模型。调度员助手在另一个项目中。我在原始问题中的代码片段位于视图模型中,我想在单元测试中介绍它。我尝试将DispatcherHelper.Initialize()放入测试项目中,但没有成功。我将再试一次。。但我必须相信如果你在其中一个项目中得到了DispatcherHelper Init,它应该在两个项目中都能工作。。。也许我错了。。可能它已连接到应用程序。。但当前的应用程序是测试项目。。嗯……它应该可以工作,因为DispatcherHelper正在静态存储主线程的dispatcher。听起来你初始化DispatcherHelper实在太晚了。尝试确保在使用UIDispatcher属性之前调用Initialize方法。干杯。所以我回去,在调用视图模型上的属性之前,立即将Initialize()调用添加到我的单元测试中,该视图模型将数据加载到利用DispatcherHelper的getter中。当我通过它,我看到它说,UIDispatcher不再是空的。。。我不知道之前出了什么问题。然而,我看不出它是否真的被修复了,因为我的测试显示异常被抛出,但未被处理。似乎无法追踪这是在哪里发生的,因为这使我的测试没有结论。。。想法?谢谢你的评论,我的DispatchHelper在初始化之前无法工作。
[TestMethod]
public void TestMethod1()
{
   Assert.IsNotNull(DispatcherHelper.UIDispatcher, "UI Dispatcher should not be null");

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