如何在测试配方函数时自动剔除依赖项

本文关键字:依赖 函数 测试 方函数 | 更新日期: 2023-09-27 18:11:05

我有一个函数foo(),它反过来调用函数bar()。我怎么才能确定酒吧真的有人来过电话?

要测试的复杂业务逻辑方法示例:

class Car
{
  IStarter starter
  IKeyhole keyhole
  IBrakePedal pedal
  Drive()
  {
    keyhole.InsertKey()
    keyhole.RotateToStart()
    starter.TurnEngineOver()
    ...
    if (pedal.Pressed)
      this.SlowDown()
  }
}

我有一个方法,它汇集了6个外部依赖关系(与方法的接口),并按顺序运行它们,顺序不重要。我想确保每个人都打过电话。在另一个测试中,我想调整条件并确保调用了一个子集。

在c#与Moq中,我有一整页的设置代码。

下面是我希望在单元测试中看到的内容:

let `check that brake pedal slows down car` =
   let car = new Car()
   car.pedal.Pressed <- true
   car.Drive()
   car.SlowDown |> wasCalled

其余的应该从用法中推断出来。我确实需要降低测试中的噪声

如何在测试配方函数时自动剔除依赖项

我知道最接近你想要的是一个AutoMockingContainer

简而言之,它是一个IoC容器,它给你一个Car,所有的IStarter, IKeyhole, IBrakepedal都stub出来并连接到Car实例,而不需要你显式地注册它们中的任何一个。然后像往常一样继续设置您的期望(在您的示例中,"car. slow()被调用"),然后调用被测试的方法。

具体取决于所使用的IoC容器和模拟框架。最初的版本是用Windsor和老版本的Rhino Mocks编写的,但是现在有了StructureMap、Ninject、Autofac + Moq等的AMC。

您可以从其中一个开始,并将其换行以使其在f#中更习惯。

它有它的缺点,我不建议使用"by default"