【问题标题】:How do I unit test code that creates a new Process?如何对创建新流程的代码进行单元测试?
【发布时间】:2009-06-02 07:02:29
【问题描述】:

如何测试以下方法?

它是接口的具体类实现上的方法。

我已经用一个只公开我需要的方法和属性的接口包装了Process 类。 ProcessWrapper 类就是这个接口的具体实现。

    public void Initiate(IEnumerable<Cow> cows)
    {
        foreach (Cow c in cows)
        {
            c.Process = new ProcessWrapper(c);
            c.Process.Start();
            count++;
        }
    }

【问题讨论】:

    标签: c# unit-testing tdd


    【解决方案1】:

    有两种方法可以解决这个问题。首先是使用依赖注入。您可以注入一个工厂并让 Initiate 调用 create 方法来获取测试所需的 ProcessWrapper 类型。

    另一种解决方案是使用诸如 TypeMock 之类的模拟框架,它可以让您解决这个问题。 TypeMock 基本上允许您模拟任何东西,因此您可以使用它来提供模拟对象而不是实际的 ProcessWrapper 实例。

    【讨论】:

    • 我正在使用最小起订量,但不确定如何模拟它。你会如何在 TypeMock 中做到这一点?
    • TypeMock 的独特之处在于它修改了 IL,这允许它模拟您无法模拟的实体。我仍然会首先推荐注入方法,但如果那是不可能的,你可以看看 TypeMock。
    【解决方案2】:

    我不熟悉 C#(我更喜欢没有哈希的 C#),但是您需要某种进程接口(IPC 或任何最方便的方法),以便您可以向它发送测试请求并返回结果.在最简单的层面上,您只需向进程发送消息并接收结果。或者你可以有更多的粒度并从你的测试工具发送更具体的命令。这取决于您如何设置单元测试环境,更准确地说是您如何发送测试命令、如何接收它们以及如何报告结果。

    我个人会在流程中拥有一个测试对象,它只是接收、运行和报告单元测试结果,并在该对象中拥有测试代码。

    【讨论】:

      【解决方案3】:

      您的流程是做什么的?有什么方法可以检查它是否正在做它应该做的事情?例如,它可能会写入文件或数据库表。或者它可能会暴露一个 API(IPC、Web 服务等),您可以尝试使用测试数据进行调用。

      从 TDD 的角度来看,插入一个“模拟/测试流程”来执行一些您可以轻松检查的操作可能是有意义的。 (这可能需要更改代码以允许您的测试代码注入一些东西。)这样,您只是在测试您的调用代码,而不必测试实际的业务流程。然后,您可以进行不同的单元测试来测试您的业务流程。

      【讨论】:

      • 我的意思是你的子流程是做什么的?有什么方法可以检查你的子流程是否在做它应该做的事情?
      • 子进程执行一个新进程.. 例如。运行另一个带有参数的程序,该程序完成所有工作。后来我只是检查它是否已经完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多