资讯专栏INFORMATION COLUMN

NPM测试模块之rewire教程

dockerclub / 599人阅读

摘要:在玩转单元测试,我介绍了个用于编写测试代码的模块以及。为了怂恿大家写单元测试,我再介绍一款神奇的测试模块。顾名思义,这两个函数可以分别用于获取和修改模块中的变量函数。另外,模块还提供了接口,可以用于一次性重写私有变量函数。

摘要:有了rewire模块,再也不用担心测试私有函数了。

在玩转Node.js单元测试,我介绍了3个用于编写测试代码的NPM模块:Mocha, Should以及SuperTest。为了怂恿大家写单元测试,我再介绍一款神奇的NPM测试模块:rewire。

GitHub仓库: Fundebug/rewire-tutorial

rewire原理

对于技术,知其然,也应该知其所以然。

对于rewire,它的基本功能与require相同,都是用于导入模块,只是,它会为导入的模块添加两个特殊的函数:__get____set__。顾名思义,这两个函数可以分别用于获取和修改模块中的变量/函数。测试的时候,当我们需要获取或者重写私有变量/函数,rewire非常有用。

__get__: 获取私有变量/函数

下面是需要测试的代码示例1:

// 公有函数add
function add(a, b)
{
    return a + b;
}

// 私有函数sub
function sub(a, b)
{
    return a - b;
}

exports.add = add;

可知,add为公有函数,而sub为私有函数。

测试公有函数add时,非常方便,require之后可以直接获取:

// 测试公有函数add
var assert  = require("assert");
var add = require("../test1.js").add;

it("1加1等于2", function()
{
    var result = add(1, 1);
    assert.equal(result, 2);
});

但是,测试私有函数sub时,使用require是无法获取的。这时,可以使用rewire导入模块,然后使用其提供的__get__方法获取私有函数:

// 测试私有函数sub
var assert  = require("assert");
var rewire = require("rewire");
var sub = rewire("../test1.js").__get__("sub");

it("2减1等于1", function()
{
    var result = sub(2, 1);
    assert.equal(result, 1);
});

在编写模块的时候,难免存在一些私有变量或者函数,有了rewire,我们就可以方便地获取,然后进行测试。

Fundebug是全栈JavaScript错误监控平台,支持各种前端和后端框架,可以帮助您第一时间发现BUG!

__set__: 重写私有变量/函数

下面是需要测试代码示例2:

var fs = require("fs")

function add(a, b)
{
    let result = a + b;
    fs.writeFileSync("result.txt", result);
    return result;
}

exports.add = add;

可知,如果直接测试的话,add函数的计算结果会写入result.txt文件:

var assert = require("assert");
var add = require("../test2.js").add;

it("1加1等于2", function()
{
    let result = add(1, 2);
    assert.equal(result, 3);
});

但是,当我们测试时,并不希望去写磁盘,因为当内容很多时,这样比较浪费时间。这时,我们可以使用rewire导入模块,然后使用其提供的__set__来重写fs模块,避免真的去写磁盘:

var assert = require("assert");
var rewire = require("rewire");
var myModule = rewire("../test2.js")
var add = myModule.add;

var fsMock = {
    writeFileSync: function(file, data, option) { /* 啥也不干 */ }
};

myModule.__set__("fs", fsMock);

it("1加1等于2", function()
{
    let result = add(1, 2);
    assert.equal(result, 3);
});

在实践中,为了简化测试和节省时间,我们通常需要去重写函数调用的外部函数,这时可以选择使用rewire模块实现。

另外,rewire模块还提供了__with__接口,可以用于一次性重写私有变量/函数。不过这个功能通常可以使用mocha的before/after以及beforeEach/afterEach来实现,更为直观,因此本文不再介绍。

参考

Fundebug: 玩转Node.js单元测试

Fundebug: 重新思考单元测试


版权声明:
转载时请注明作者Fundebug以及本文地址:
https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/8781.html

相关文章

  • NPM测试模块rewire教程

    摘要:在玩转单元测试,我介绍了个用于编写测试代码的模块以及。为了怂恿大家写单元测试,我再介绍一款神奇的测试模块。顾名思义,这两个函数可以分别用于获取和修改模块中的变量函数。另外,模块还提供了接口,可以用于一次性重写私有变量函数。 摘要:有了rewire模块,再也不用担心测试私有函数了。 在玩转Node.js单元测试,我介绍了3个用于编写测试代码的NPM模块:Mocha, Should以及Su...

    zxhaaa 评论0 收藏0
  • 通过create-react-app从零搭建react环境

    摘要:通过文件可以对图标名称等信息进行配置。注意,注册的只在生产环境中生效,并且该功能只有在下才能有效果该文件是过滤文件配置该文件是描述文件定义了项目所需要的各种模块,以及项目的配置信息比如名称版本许可证等元数据。 一、 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app 开始项目: ...

    Cympros 评论0 收藏0
  • 通过create-react-app从零搭建react环境

    摘要:通过文件可以对图标名称等信息进行配置。注意,注册的只在生产环境中生效,并且该功能只有在下才能有效果该文件是过滤文件配置该文件是描述文件定义了项目所需要的各种模块,以及项目的配置信息比如名称版本许可证等元数据。 一、 快速开始: 全局安装脚手架: $ npm install -g create-react-app 通过脚手架搭建项目: $ create-react-app 开始项目: ...

    CoyPan 评论0 收藏0
  • create-react-app+react-app-rewired搭建viewport解决方案

    摘要:一个中使用的。比如在项目中的引入它们在中加入以下代码修改项目中的后记完结撒花本文简单研究了一下如何搭建解决方案,如有错误欢迎指出。 create-react-app搭建vw-layout解决方案 前言:我第一次接触到vw适配移动端的方案是在大漠先生的博客里(如何在Vue项目中使用vw实现移动端适配),强烈建议没看过的朋友先去看一下这篇博客。vw解决方案早有耳闻,我也很想上手尝试一下,所...

    lbool 评论0 收藏0
  • 从零开始学习 React 高阶组件

    01、介绍 React 高阶组件也叫做 React HOC(High Order Component), 它是react中的高级技术, 用来重用组件逻辑。 但高阶组件本身并不是React API。它只是一种模式,这种模式是由react自身的组合性质必然产生的。 那么在学习高阶组件之前有一个概念我们必须清楚,就是高阶函数。 02、高阶函数 概念:高阶函数是一个函数,它接收函数作为参数或将函数作...

    _Dreams 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<