2012-05-09 37 views
3

我有具有以下结构的方法的方法:收件NUnit测试情况下它会提示消息框

bool myMethod(some arguments) 
{ 

    //Show User Dialog 

} 

示出用户对话框,其具有4个按钮,“是”,“是要全部” ,“否”,“全无”。

当我运行测试用例时,它显示用户对话框,但测试用例不会继续,直到用户单击任何按钮。我们如何使用nUnit Test案例来覆盖这些方法?

+0

对话框是这个方法所做的* only *事情吗? (如果是这样,您不需要测试它。)或者该方法是否将该对话框显示为其他一些工作的一部分? (如果是这样,您需要将显示对话框的部分截掉,就像@Oliver在他的回答中所建议的那样)。 –

回答

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

这取决于你想测试什么。 如果你只是关心应用程序的用户响应后流(它们按YES,NO等),那么你可以只踩灭了一个“假”的回应:

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

等。

+0

var result ==当Message Box关闭时,将执行DialogResult.OK。但是如何关闭消息框,我无法更改显示消息框的原始源代码。 –

+0

基本上,我不想要运行测试用例的任何用户交互。 –

+0

我的观点是你甚至不会打开一个消息框,你假冒你的测试案例的回应。 –

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")); 
} 
相关问题