で、WPF MVVMユニットテストを一致しなかった私は、彼らがしているときにユーザがYesNoCancel
メッセージボックスで「はい」ボタンをクリックしたかどうかをテストするために部品番号でWPFでユニットテストを書いていますウィンドウを閉じる。私のCloseCommand
では、私は私のViewModelを持っているユーザーは、ウィンドウを閉じているとき、次のメッセージを表示します。以下のセットアップが部品番号
var result = _messageSvc.Show(
"Do you want to save changes?",
"Save Changes",
Services.MessageBoxButton.YesNoCancel,
Services.MessageBoxIcon.Question,
Services.MessageBoxResult.Yes);
私_messageSvc
は、メッセージボックスを表示するカスタムメッセージングサービスの内部のプライベートインスタンスです。ここではサービスのためのコードは次のとおりです。
public interface IMessageSvc
{
void Show(string message);
MessageBoxResult Show(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon, MessageBoxResult defaultResult = 0);
}
public class MessageSvc : IMessageSvc
{
public void Show(string message)
{
MessageBox.Show(message);
}
public MessageBoxResult Show(string message, string caption, MessageBoxButton buttons, MessageBoxIcon icon, MessageBoxResult defaultResult)
{
return (MessageBoxResult)MessageBox.Show(message, caption, (System.Windows.MessageBoxButton)buttons, (System.Windows.MessageBoxImage)icon, (System.Windows.MessageBoxResult)defaultResult);
}
}
注:MessageBoxButton
、MessageBoxIcon
、およびMessageBoxResult
は、私は.NETが箱から出して提供するものを模倣するために、同じファイルで行われた列挙されています。
[TestMethod]
public void ShouldAskToSaveOnCloseRespondYesTest()
{
// Mock and setup initial user data
var u= new User
{
UserId = 1,
UserName = "FirstName LastName",
FavoriteColor = "Blue"
};
mainViewModel.UserInfo= new UserInfoDtoWrapper(u);
// assert the data has not changed yet
Assert.IsFalse(mainViewModel.UserInfo.IsChanged);
// change the user data
mainViewModel.UserInfo.UserName= "LastName FirstName";
// assert the data has changed
Assert.IsTrue(mainViewModel.UserInfo.IsChanged);
// execute window closing
mainViewModel.CloseCommand.Execute(new object());
// verify messagebox shows and the 'Yes' button is clicked
// this will then save the changes made to the user instance
var messageBox = new Mock<IMessageSvc>();
messageBox.Setup(x => x.Show(It.Is<string>(y => y == "Do you want to save changes?"),
It.Is<string>(y => y == "Save Changes"),
It.Is<MessageBoxButton>(y => y == MessageBoxButton.YesNoCancel),
It.Is<MessageBoxIcon>(y => y == MessageBoxIcon.Question),
It.Is<MessageBoxResult>(y => y == MessageBoxResult.Yes)))
.Returns(MessageBoxResult.Yes);
messageBox.Verify();
}
エラーがmessageBox.Verify()
オンラインになるが、私は、私はそれを正しくやって見ることができるものから:私は私のユニットテストがある可読性
のためにここでそれらを示していないです。ユーザが「はい」ボタンをクリックした後に何が起こるかをテストするためにメッセージボックスの戻り値を取得する必要があるため、Verify
をLinqクエリで使用したくない代わりに結果を取得する必要があります。
おかげ
"エラーメッセージボックスにはエラーが表示されます。 –
ShouldAskToSaveOnCloseRespondYesTest例外が発生しました:Moq.MockVerificationException:次の設定が一致しませんでした:IMessageSvc x => x.Show(It.Is(y => y == "変更を保存しますか?")、It.Is (y => y == "Save Changes")... –
セットアップと検証の間の残りの部分はどこですか?現在はテストは実行されていません –