如何对使用依赖项的FP功能进行单元测试

时间:2019-04-07 00:46:30

标签: unit-testing dependency-injection functional-programming

试图了解函数式程序员如何在没有依赖注入的情况下对具有依赖项的函数进行单元测试。 为了对模拟进行单元测试,您可以通过方法签名或通过类似构造函数/构造函数的机制来提供依赖项。

因此,如果您具有如下功能组合:

a -> b -> c -> d

如果您有d在谈论某种依赖关系,d如何进行单元测试? 无论依赖关系保存在哪里,我都希望对其进行单元测试。 我想知道函数式程序员采用什么方法。

1 个答案:

答案 0 :(得分:0)

您可以使用适当的作用域模拟依赖注入对单元代码进行单元测试。让我告诉你我的意思。

const square = x => x ** 2

const isOdd = x => x % 2 === 1

const addDependentValue = dependency => x => x + dependency.value

const mockDependency = { value: 5 }

it('filters out evens, squares, and adds value from dependency', () => {
  const output = pipe([
    filter(isOdd),
    map(square),
    map(addDependentValue(mockDependency)),
  ])([1, 2, 3, 4, 5])
  assert.deepEqual(output, [6, 14, 30]) // OK
})

我们作用域我们的函数addDependentValue,以便返回结果可以“看到”依赖关系(在范围内)。在测试中,我们使用mockDependency 模拟了依赖项。这将使我们能够在测试中得出可预测的结果。在一个不太人为的示例中,您的模拟应镜像您要模拟的任何依赖项的接口。最后,我们在测试中注入 mockDependency,从而使我们能够合理地测试该管道。

如何测试一个单元?

a是纯粹的,因此您可以为此编写一个简单的单元测试

// if a is square
it('squares', () => {
  assert.strictEqual(square(3), 9) // OK
})