我想为 C# 代码编写测试用例,以触发事件或向用户显示表单以供输入,例如:
private void CreateRecord_Click(object sender, EventArgs e)
{
try
{
this.InitiateRecording();
}
catch (BubbleUiException ex)
{
objLog.Error(TextRes.IDC_EShuttleError, ex);
MessageBox.Show(
ex.Message,
TextRes.IDC_EShuttleError,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
catch (Exception ex)
{
objLog.Error("Error occurred", ex);
MessageBox.Show(
ex.Message,
TextRes.IDC_Error,
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
如何使用 Mbunit 为这些类型的代码编写单元测试?
"纯粹主义"的答案是,由于它是一种私有方法,因此不应对其进行单元测试,因为它是实现细节。您应该只测试公共 API。
由于它是一个事件处理程序,因此出于各种原因,您可能仍希望对其进行测试。正如目前所写,这将很难做到。事实上,你有一个
this.InitiateRecording();
行表明您尚未正确实现关注点分离。用于处理事件的类似乎还包含用于处理记录的代码。其次,您有对 MessageBox.Show 的硬编码调用,这将使测试变得困难,因为您的测试无法以自动、独立的方式运行。
因此,我建议:
- 将录制功能重构为一个单独的类,该类可以进行单元测试。
- 将 MessageBox.Show 方法注入该类,以便在测试期间可以存根。
- 不要测试 CreateRecord_Click((,因为它只会在新类中调用一个方法。
测试:
-
this.InitiateRecording()
被称为 - 调用
this.InitiateRecording()
时强制BubbleUiException
- 强制调用
this.InitiateRecording()
时未BubbleUiException
Exception
- 换行
MessageBox.Show
以便您可以测试它在引发异常时是否打印出预期的内容。 - 调用测试
objLog.Error
。
您可以假定您的 click 事件有效(单击控件时调用该方法(,因为Microsoft已经对此进行了测试。