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

时间:2011-10-13 15:37:12

标签: c# unit-testing f#

我有一个函数foo(),它反过来调用函数bar()。如何确认实际调用了该栏?

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

class Car
{
  IStarter starter
  IKeyhole keyhole
  IBrakePedal pedal
  Drive()
  {
    keyhole.InsertKey()
    keyhole.RotateToStart()
    starter.TurnEngineOver()

    ...

    if (pedal.Pressed)
      this.SlowDown()
  }
}

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

在使用Moq的C#中,我有一整页设置代码。

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

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

其余部分应从使用中推断出来。我真的需要减少测试中的噪音。

1 个答案:

答案 0 :(得分:2)

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

简而言之,它是一个IoC容器,可以为您提供一辆Car,其中包含所有IStarter,IKeyhole,IBrakepedal,并将其连接到Car实例,而无需您明确注册其中任何一个。然后你像往常一样设定你的期望(在你的情况下,“car.SlowDown()被调用”),然后调用被测试的方法。

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

你可以从其中一个开始并将其包装起来,使它在F#中更加惯用。

It has its downsides,这不是我建议“默认使用”的内容。