0

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

4

2 回答 2

3

“纯粹”的答案是,因为它是一个私有方法,它不应该被单元测试,因为它是一个实现细节。您应该只测试公共 API。

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

this.InitiateRecording();

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

因此,我建议:

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

测试:

  1. this.InitiateRecording()叫做
  2. 强制调用BubbleUiExceptionthis.InitiateRecording()
  3. 强制 aException不是BubbleUiException何时this.InitiateRecording()被调用
  4. 包装MessageBox.Show,以便您可以测试它在抛出异常时打印您期望的内容。
  5. objLog.Error称为测试。

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

于 2013-10-07T12:05:14.590 回答