我有一个具有以下结构的方法:
bool myMethod(some arguments)
{
//Show User Dialog
}
显示用户对话框,其中包含4个按钮,“是”,“全是”,“否”,“全是”。
当我运行测试用例时,它会显示用户对话框,但在用户单击任何按钮之前,测试用例不会继续。我们如何使用nUnit测试用例来涵盖这些方法?
答案 0 :(得分:2)
你必须注入一些存根 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);
}
答案 1 :(得分:1)
这取决于您要测试的内容。 如果你只关心用户响应之后应用程序的流程(他们按YES,NO等),那么你可能只是存在一个“假的”响应:
public void MessageBox_UserPressesOK()
{
var result == Dialog.OK
// test
}
等等。
答案 2 :(得分: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"));
}