Напишите тестовый пример NUnit для метода, который запрашивает окно сообщения

У меня есть метод со следующей структурой:

bool myMethod(some arguments)
{

   //Show User Dialog

}

Отображается диалоговое окно с 4 кнопками "Да", "Да для всех", "Нет", "Нет для всех".

Когда я запускаю тестовый пример, он показывает диалоговое окно пользователя, но тестовый пример не продолжается, пока пользователь не нажмет любую кнопку. Как мы покрываем такие методы, используя nUnit Test case?

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);
}

Это зависит от того, что вы хотите проверить. Если вы просто обеспокоены ходом приложения после ответа пользователя (они нажимают YES, NO и т. Д.), Тогда вы можете просто заглушить "фальшивый" ответ:

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"));
}
Другие вопросы по тегам