【问题标题】:JavaScript unit testing with external module使用外部模块进行 JavaScript 单元测试
【发布时间】: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


【解决方案1】:

为了在测试期间覆盖依赖项,我建议在您的情况下使用 https://github.com/thlorenz/proxyquire 模块

例如,我从项目 github 粘贴示例

foo.js:

var path = require('path');

module.exports.extnameAllCaps = function (file) {
 return path.extname(file).toUpperCase();
};

module.exports.basenameAllCaps = function (file) {
 return path.basename(file).toUpperCase();
}

foo.test.js:

var proxyquire =  require('proxyquire')
, assert     =  require('assert')
, pathStub   =  { };

// when no overrides are specified, path.extname behaves normally
var foo = proxyquire('./foo', { 'path': pathStub });
assert.equal(foo.extnameAllCaps('file.txt'), '.TXT');

【讨论】:

    猜你喜欢
    • 2020-01-03
    • 2022-10-18
    • 2016-07-07
    • 2022-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    相关资源
    最近更新 更多