私は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
問題を解決するためにを入れましたが、効果がありませんでした。
自動テストでnoisolation
MSTestコマンドラインのフラグが使用されていることがわかったので、それを削除しました。ただし、これにより「合格」が1回発生し、次は「不合格」になります。
私はこれらすべてにおいて重要な何かを見逃していると思いますが、それが何であるかを理解することはできません。誰かが私が間違っていることを教えてくれるのを手伝ってもらえますか?