【发布时间】:2012-10-16 18:08:41
【问题描述】:
我正在使用 VS2010,用 MSTest 编写单元测试。我的项目使用 WPF、MVVM 和 PRISM 框架。我也在使用 Moq 来模拟接口。
我正在测试命令和列表中选定项目之间的交互。根据 MVVM 模式,交互被封装在 ViewModel 中。基本上,当设置了 SelectedDatabase 时,我希望命令引发 CanExecute。我已经为行为编写了这个测试:
public void Test()
{
var databaseService = new Mock<IDatabaseService>();
var databaseFunctionsController = new Mock<IDatabaseFunctionsController>();
// Create the view model
OpenDatabaseViewModel viewModel
= new OpenDatabaseViewModel(databaseService.Object, databaseFunctionsController.Object);
// Mock up the database and its view model
var database = TestHelpers.HelpGetMockIDatabase();
var databaseViewModel = new DatabaseViewModel(database.Object);
// Hook up the can execute changed event
var resetEvent = new AutoResetEvent(false);
bool canExecuteChanged = false;
viewModel.OpenDatabaseCommand.CanExecuteChanged += (s, e) =>
{
resetEvent.Set();
canExecuteChanged = true;
};
// Set the selected database
viewModel.SelectedDatabase = databaseViewModel;
// Allow the event to happen
resetEvent.WaitOne(250);
// Check that it worked
Assert.IsTrue(canExecuteChanged,
"OpenDatabaseCommand.CanExecuteChanged should be raised when SelectedDatabase is set");
}
在OpenDatabaseViewModel 上,SelectDatabase 属性如下:
public DatabaseViewModel SelectedDatabase
{
get { return _selectedDatabase; }
set
{
_selectedDatabase = value;
RaisePropertyChanged("SelectedDatabase");
// Update the can execute flag based on the save
((DelegateCommand)OpenDatabaseCommand).RaiseCanExecuteChanged();
}
}
还有在视图模型上:
bool OpenDatabaseCanExecute()
{
return _selectedDatabase != null;
}
TestHelpers.HelpGetMockIDatabase() 只是得到一个模拟 IDatabase 并设置了一些属性。
当我从 VS2010 运行测试时,此测试通过,但在服务器上作为自动构建的一部分执行时失败。我输入了AutoResetEvent 尝试解决问题,但没有任何效果。
我发现自动化测试在 MSTest 命令行中使用了 noisolation 标志,所以我删除了它。然而,这产生了一次“通过”,但下一次产生了“失败”。
我认为我在这一切中遗漏了一些重要的东西,但我无法弄清楚它是什么。谁能帮忙告诉我我做错了什么?
【问题讨论】:
标签: c# wpf unit-testing mvvm mstest