我有一个带有自定义消息框的功能,

public bool SomeFunction()
{
   MessageBoxResult mResult= MessageBox.Show("Displaying message");
   bool result;
   if(mResult == MessageBoxResult.OK)
   {
     result = AnyFunction();
   }
    return result;
}


我想为这种方法编写一个单元测试,而不显示消息框。有什么办法吗?我正在使用'Microsoft.VisualStudio.TestTools'

最佳答案

这可能是使用moq的一种方法。这个想法是将真正的消息框实现隐藏在界面后面,然后根据您希望在测试中实现的功能模拟其行为。

实作

public interface IMessageBox
{
    MessageBoxResult Show(string msg);
}

public class SomeClass
{
    private readonly IMessageBox _messageBox;

    public SomeClass(IMessageBox messageBox)
    {
        _messageBox = messageBox;
    }

    public bool SomeFunction()
    {
        MessageBoxResult mResult = _messageBox.Show("Displaying message");
        bool result;
        if(mResult == MessageBoxResult.OK)
        {
            result = AnyFunction();
        }
        return result;
    }
}


单元测试:

Mock<IMessageBox> messageBoxMock = new Mock<IMessageBox>();
messageBoxMock.Setup(m => m.Show(It.IsAny<string>()))
    .Returns(MessageBoxResult.OK); //can be whatever depends on test case
SomeClass sut = new SomeClass(messageBoxMock.Object);

07-26 07:44