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

这取决于你想测试什么。如果您只是关心用户响应后应用程序的流程(他们按是、否等),那么您可以只存根“假”响应:

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

等等。

于 2012-05-09T10:44:04.827 回答
1

您可以使用Typemock Isolator(请注意,这不是免费工具),这是他们网页上的确切示例:

[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 回答