【问题标题】:Unit Testing forms and Events in c#c# 中的单元测试表单和事件
【发布时间】:2013-10-07 12:01:53
【问题描述】:

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

【问题讨论】:

  • 这会很困难,因为您似乎没有编写可单元测试的代码。

标签: c# unit-testing mbunit


【解决方案1】:

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

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

this.InitiateRecording();

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

因此我建议:

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

【讨论】:

  • 非常感谢大卫的建议。我希望只测试各种异常的启动记录就足够了测试,而不用担心事件是否被正确引发。
  • 也可以注入日志。作为
  • @Tony,这确实是一个进一步的改进。
  • @Tony :也可以注入日志,这是否意味着在单元测试中进行日志记录?还是别的什么??
  • @priya 这意味着您可以在测试方法时用假记录器替换真实记录器。因此,您可以测试您的代码,而不必担心记录器在做什么或不做什么。
【解决方案2】:

测试:

  1. this.InitiateRecording() 被调用
  2. 在调用this.InitiateRecording() 时强制使用BubbleUiException
  3. 在调用 this.InitiateRecording() 时强制使用不是 BubbleUiExceptionException
  4. 包装MessageBox.Show,这样您就可以测试它在抛出异常时打印出您所期望的内容。
  5. 测试objLog.Error 被调用。

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

【讨论】:

  • 您在这里的建议是编写一个测试来测试当前编写的 CreateRecord_Click() 功能。这既是不好的做法(应该测试行为,而不是实现),而且会导致创建一个非常脆弱的测试,一旦实现发生变化就会中断。
  • @DavidArno 你说的很对,OP 的代码在当前形式下是不可测试的。我建议他如何以当前形式对其进行测试,这就是他所要求的。
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2014-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-25
  • 2021-11-06
  • 2021-08-08
相关资源
最近更新 更多