NPM测试模块之rewire教程

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

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

rewire原理

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

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

__get__: 获取私有变量/函数

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

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

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

exports.add = add;

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

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

// 测试公有函数addvar 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__方法获取私有函数:

// 测试私有函数subvar 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以及本文地址:
https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

原文地址:https://www.cnblogs.com/fundebug/p/8353142.html

时间: 2024-08-02 23:49:21

NPM测试模块之rewire教程的相关文章

可以用py库: pyautogui (自动测试模块,模拟鼠标、键盘动作)来代替pyuserinput

PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块 pyUserInput模块安装前需要安装pywin32和pyHook模块.(想要装的看https://www.cnblogs.com/mapu/p/9235571.html) pyautogui 库 2017-10-4 python pip.exe install pyautogui python3.6下,直接就可以安装了,无须其它依赖 http://blog.csdn.net/astroboythu/article/details

Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版

Spring Boot -05- 多模块结构项目构建与测试(详细图文教程)IDEA 版 百度很多博客都不详细,弄了半天才把 Spring Boot 多模块项目构建开发整的差不多,特地重新创建配置,记录一下,也分享给有需要的人 本篇也会非常详细的介绍涉及的基础知识点,更多都写在注释上了 先放成功截图: (1)项目结构: (2)启动: (3)测试主子模块: (4)测试子模块依赖: 第一步:创建父模块,子模块 (1)打开创建项目窗口,点击 Create New Project (2)填写 (3)填写

OSG 中 相交测试 模块 工作流程及原理

主要涉及三个类: 1. osgUtil::PolytopeIntersector // 具体不同算法实现类 2. osgUtil::IntersectionVisitor //用来遍历节点树的每个节点 3.osg::Node * mNode;  //  你要做相交测试的根节点 先看用法: osg::ref_ptr<osgUtil::PolytopeIntersector> intersector = new osgUtil::PolytopeIntersector(osgUtil::Inter

bug管理工具之禅道的测试模块的使用

由于公司的bug管理工具是禅道,上手之前看了下禅道测试模块的使用,并记录了下来 角色:产品经理PO,项目经理PM,开发,测试 测试任务: bug: 1.维护bug视图模块:[测试]-[Bug]-左侧[维护模块]:维护软件每一个模块,即新建-删除-修改模块/子模块名称(如[首页]模块,[关于我们]模块) 2.提交bug:[测试]-[Bug]-[+提Bug] 注意点: (1)Bug的优先级别(见bug优先级别随笔)以及严重级别标准? (2)Bug负责人如何划分? (3)Bug修复截止时间如何确定?

CentOS6.5 从源码编译安装 GCC-4.9.1 全程实录,包含测试使用《图文教程》

前言 GCC(GNU Compiler Collection,GNU编译器合集)是linux以及其他类UNIX平台上进行开源项目,软件开发等必不可少的工具链组成之一(工具链的其他成员包括 binutils,Glibc,libstdc++ 等) 另外,对于程序员以及系统管理员而言,经常需要从软件的源码手动编译安装,而不论是configure脚本,还是make工具/makefile文件,最终都需要调用gcc(或者其它编译器)来进行实际的编译工作,因此,经常需要使用gcc的新版特性,并且与旧版gcc共

详解npm的模块安装机制

详解npm的模块安装机制 依赖树表面的逻辑结构与依赖树真实的物理结构 依赖树表面的逻辑结构与依赖树真实的物理结构并不一定相同! 这里要先提到两个命令:tree -d(linux)和npm ls(npm) 在一个npm项目下: tree -d命令以树状图的方式列出一个项目下所有依赖的物理结构 npm ls命令以树状图的方式列出一个项目下所有依赖的逻辑结构 以官方文档为例子: 项目example1有两个依赖模块:mod-a模块和mod-c模块: mod-a模块有一个依赖模块[email protec

前端测试框架Jest系列教程 -- Expect(验证)

写在前面 在编写测试时,我们通常需要检查值是否满足某些条件,Jest中提供的expect允许你访问很多“Matchers”,这些“匹配器”允许您验证不同的东西. Expect 可以验证什么 Jest中提供了如下的验证方法: expect(value) expect.extend(matchers) expect.anything() expect.any(constructor) expect.arrayContaining(array) expect.assertions(number) ex

python中关于不执行if __name__ == &#39;__main__&#39;:测试模块的解决

1.新建测试脚本文件: 2.编辑测试脚本 import unittest import requests import json import HTMLTestRunner ur1 = 'http://118.178.247.67:8081/systLogonUser/adminLogon.do' headers = {'Content-Type':'application/x-www-form-urlencoded','Referer':'118.178.247.67'} data = { '

go语言如何书写测试模块

如何在go语言中使用原生的testing模块书写测试模块 1.首先对于test模块如何去命名 按照官方的规定在书写test包的时候,应该以源文件名加上_test.go的结尾来书写测试包.如原文件名为`main.go`则测试包按照规定应该写为`main_test.go`.当然假如你的这两个文件在同一个文件夹内是没有问题的,而且只要保证是_test结尾即可. 2.测试包的举例 源文件 main.go package main import "fmt" func gotest(num int