我有一个具有以下结构的方法:
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);
}
这取决于你想测试什么。如果您只是关心用户响应后应用程序的流程(他们按是、否等),那么您可以只存根“假”响应:
public void MessageBox_UserPressesOK()
{
var result == Dialog.OK
// test
}
等等。
您可以使用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"));
}