c#中的单元测试表单和事件

时间:2013-10-07 12:01:53

标签: c# unit-testing mbunit

我想编写用于触发事件或向用户显示表单的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为这类代码编写单元测试?

2 个答案:

答案 0 :(得分:3)

“纯粹主义”的答案是,由于它是一种私有方法,因此不应进行单元测试,因为它是一个实现细节。您应该只测试公共API。

由于它是一个事件处理程序,您可能仍希望出于各种原因对其进行测试。正如目前所写,这将很难做到。事实上你有一个

this.InitiateRecording();

行表示您未正确实施关注点分离。您处理事件的类似乎也包含处理录制的代码。其次,您对MessageBox.Show进行了硬编码调用,这将使测试变得困难,因为您的测试无法以自动,独立的方式运行。

我建议:

  1. 将录制功能重构为一个单独的类,可以进行单元测试。
  2. 将MessageBox.Show方法注入该类,以便在测试期间将其存根。
  3. 不要测试CreateRecord_Click(),因为它只会调用新类中的方法。

答案 1 :(得分:0)

测试:

  1. this.InitiateRecording()被称为
  2. 在调用BubbleUiException
  3. 时强制this.InitiateRecording()
  4. 在调用Exception时强制BubbleUiException this.InitiateRecording()
  5. 换行MessageBox.Show,以便测试它会在抛出异常时打印出您所期望的内容。
  6. 调用objLog.Error。{/ li>

    您可以假设您的点击事件有效(在点击控件时调用该方法),因为Microsoft已对此进行了测试。