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