3

次の構造のメソッドがあります。

bool myMethod(some arguments)
{

   //Show User Dialog

}

[はい]、[すべてはい]、[いいえ]、[すべていいえ] の 4 つのボタンがあるユーザー ダイアログが表示されます。

テスト ケースを実行すると、ユーザー ダイアログが表示されますが、ユーザーがいずれかのボタンをクリックするまでテスト ケースは続行されません。nUnit テストケースを使用して、そのようなメソッドをどのようにカバーしますか?

4

3 に答える 3

3

呼び出しをスタブする何かを挿入する必要があり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);
}
于 2012-05-09T10:54:51.187 に答える
1

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"));
}
于 2012-05-09T11:19:07.290 に答える
1

何をテストしたいかによります。ユーザーの応答 (YES、NO などを押す) 後のアプリケーションの流れだけが気になる場合は、「偽の」応答を書き出すことができます。

public void MessageBox_UserPressesOK()
{
var result == Dialog.OK
    // test
}

等々。

于 2012-05-09T10:44:04.827 に答える