如何在测试配方函数时自动剔除依赖项
本文关键字:依赖 函数 测试 方函数 | 更新日期: 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"