【问题标题】:Unit Testing a method which queries the database单元测试一种查询数据库的方法
【发布时间】:2017-03-22 07:33:05
【问题描述】:

所以我创建了一个接受 ID 的函数,通过存储库从返回的数据内部查询数据库,根据不同的场景对数据进行突变,然后我们返回数据。

如何对这个函数进行单元测试? 我会在我的存储库层上存根 find 方法以返回数据,这样我就不依赖于连接数据库了吗?

【问题讨论】:

    标签: node.js mongodb unit-testing testing meteor


    【解决方案1】:

    我会争辩说,您只能对可单元测试的代码进行单元测试。我对单元可测试代码的定义是具有这些属性的代码:

    1. 它从输入中获取所需的一切
    2. 它的所有工作都是通过返回值(或抛出异常)来表达的
    3. 不会产生任何副作用

    你描述的代码违反了#1,通过访问数据库。

    要直接回答您的问题,您可以模拟数据库调用,该模拟将为您的函数提供预期数据,以便您可以对其进行变异并将其与预期输出进行比较。

    但我认为真正正确的答案是重构您的代码,应用单一职责原则。您的被测代码正在做两件事(访问数据库并改变结果),而不是只做一件事。

    我会拆分数据库部分并将其指定为其他人的工作。那么您的被测代码可以将该数据库结果作为输入,其唯一工作就是改变该数据并返回结果。

    恕我直言,这将使其可单元测试。当你对它进行单元测试时,你根本不需要模拟数据库,因为你可以简单地编写你想要变异的数据并为其提供函数。

    【讨论】:

    • 那么对于一个检查参数、查询数据库然后对数据进行处理的 api 端点,我会将这些代码片段重构为它们自己的单元吗?
    • @JakeLacey,是的。如果我理解您所描述的内容,我会编写一个函数,我们称之为 GetData(),它将转到数据库。它可以返回一个承诺,并在数据返回时履行它。在其成功后, MutateData() 将对该数据进行操作。在这个例子中, MutateData() 是一个有趣的并且可能需要最多测试的一个。您可以通过模拟数据库来测试 GetData(),但您真正测试的是什么 - GetData() 是否正确使用了 Promise?测试样板代码的收益递减。希望对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多