次の構造のメソッドがあります。
bool myMethod(some arguments)
{
//Show User Dialog
}
[はい]、[すべてはい]、[いいえ]、[すべていいえ] の 4 つのボタンがあるユーザー ダイアログが表示されます。
テスト ケースを実行すると、ユーザー ダイアログが表示されますが、ユーザーがいずれかのボタンをクリックするまでテスト ケースは続行されません。nUnit テストケースを使用して、そのようなメソッドをどのようにカバーしますか?
呼び出しをスタブする何かを挿入する必要がありShow User Dialogます。次に、テスト内でスタブを目的のユーザー回答に設定し、メソッドを呼び出すことができます。
public class MyClass
{
private IMessageBox _MessageBox;
public MyClass(IMessageBox messageBox)
{
_MessageBox = messageBox;
}
public bool MyMethod(string arg)
{
var result = _MessageBox.ShowDialog();
return result == DialogResult.Ok;
}
}
internal class MessageBoxStub : IMessageBox
{
DialogResult Result {get;set;}
public DialogResult ShowDialog()
{
return Result;
}
}
[Test]
public void MyTest()
{
var messageBox = new MessageBoxStub() { Result = DialogResult.Yes }
var unitUnderTest = new MyClass(messageBox);
Assert.That(unitUnderTest.MyMethod(null), Is.True);
}
Typemock Isolatorを使用できます(これは無料のツールではないことに注意してください)。これが彼らのWebページからの正確な例です。
[Test]
public void SimpleTestUsingMessageBox()
{
// Arrange
Isolate.WhenCalled(()=>MessageBox.Show(String.Empty)).WillReturn(DialogResult.OK);
// Act
MessageBox.Show("This is a message");
// Assert
Isolate.Verify.WasCalledWithExactArguments(()=>MessageBox.Show("This is a message"));
}
何をテストしたいかによります。ユーザーの応答 (YES、NO などを押す) 後のアプリケーションの流れだけが気になる場合は、「偽の」応答を書き出すことができます。
public void MessageBox_UserPressesOK()
{
var result == Dialog.OK
// test
}
等々。