【发布时间】:2017-07-05 18:42:49
【问题描述】:
我正在处理一个现有的节点项目,其中大多数 js 文件的代码结构如下所示。
var mod1 = require("mod1");
var mod2 = require("mod2");
var modn = require("moden");
function func1(data, callback) {
// Do some validation with data etc..
// Use one or more imported modules here
}
function func2(data, callback) {
// Do some validation with data etc..
// Use one or more imported modules here
}
exports.func1 = func1
exports.func2 = func2
如何在不依赖于导入模块的情况下对 func1 进行单元测试?我如何模拟/存根它们? 我来自 Java 世界,所以我熟悉模拟概念,但在这里我不确定如何使用 require 模拟全局声明的模块导入。
目前我们正在使用 nodeunit 进行单元测试,但它只测试很小一部分代码。
我正在阅读有关 simon.js 和 testdouble 的信息,但不确定如何使用它们来模拟全局变量。
感谢任何帮助/指导。
【问题讨论】:
-
我假设
func1在内部使用了一些依赖,例如mod1。如果func1取决于所需的模块。为什么要模拟它而不是使用真正的依赖项? -
@DiegoZoracKy 你说得对。映像依赖关系可能是第 3 方调用或数据库调用。我不想让这些服务可用于单元测试。因为我对测试我正在编写的函数的功能感兴趣。此外,如果我生活在真正的依赖关系中,它们可能会在某些情况下抛出一些错误,这会破坏单元测试。
-
@JigarPatel 所以,假设
mod1是一个“数据库调用”,而func1用于处理从数据库调用接收到的数据。然后func1应该通过参数接收预期的数据,而不是通过从外部范围访问它来使用mod1。这样,您就可以将file1放在另一个不需要mod1或不需要其他模块的文件上。这对您的情况有意义吗?
标签: javascript node.js unit-testing nodeunit