您是否尝试过测试一个简单的MsgBox
(或任何模式窗口,就此而言)显示在 WinForms 应用程序中?在最近的一个项目中,我们花了一段时间与 Win32 句柄和多线程测试用例作斗争,试图一致地验证屏幕上显示的对话框(因为它是模态的,你不能只从主测试线程执行它)。测试有时会起作用,但很容易出现间歇性故障,因为没有“好”的原因(例如,由于某些后台进程,窗口在测试期间失去了焦点)。
在这种情况下,我们使用 C# 委托的强大功能来模拟对MsgBox.Show()
. 通过声明一个委托,例如
public delegate DialogResult ShowDelegate(string text, string caption);
我们可以new ErrorMessageHelper(MsgBox.Show)
在生产中使用,测试看起来像
[TestFixture]
public class ErrorDialogHelperTest
{
[Test]
public void UsesShowDelegateToDisplayMessage()
{
bool delegateWasCalled = false;
ShowDelegate mockShowDelegate = delegate(string text, string caption)
{
Assert.AreEqual("the expected message", text);
Assert.AreEqual("the expected title", caption);
delegateWasCalled = true;
};
ErrorDialogHelper helper = new ErrorDialogHelper(showDelegate);
helper.ShowErrorMessage("the expected message", "the expected title");
Assert.IsTrue(delegateWasCalled);
}
}
我们当然有进一步的测试来验证我们确实使用MsgBox.Show
. 我MsgBox
在这个例子中使用,但我们使用了类似的技术来测试我们所有模态窗口的显示。
另一个经典的难以测试的例子是你的代码需要使用挂钟日期和时间。同样,解决方案是引入一个可以从测试中控制的假时钟。在这两种情况下,您都依赖底层框架或系统实现来正常工作,并且只测试一切是否正确连接。这是否是一个合理的风险应根据具体情况确定。