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

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

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以及本文地址:
https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

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

  1. 前端测试框架Jest系列教程 -- 简介

    写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...

  2. npm常用模块汇总

    npm常用模块汇总: 点击插件名字,查看使用文档 npm常用模块汇总 node常用模块汇总 gulp常用插件汇总 npx 使用教程:npx使用教程 bable:bable这是JavaScript编译器 ...

  3. 转载自-阮一峰-测试框架 Mocha 实例教程

    测试框架 Mocha 实例教程   作者: 阮一峰 日期: 2015年12月 3日 Mocha(发音"摩卡")诞生于2011年,是现在最流行的JavaScript测试框架之一,在浏 ...

  4. 前端测试框架Jest系列教程 -- Mock Functions

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  5. 前端测试框架Jest系列教程 -- Global Functions(全局函数)

    写在前面: Jest中定义了很多全局性的Function供我们使用,我们不必再去引用别的包来去实现类似的功能,下面将列举Jest中实现的全局函数. Jest Global Functions afte ...

  6. Python测试模块doctest

    面试被问到了却没有用过,很尴尬:今天看了一下,真的是一个很简单的测试模块 方便起见,这里直接拿菜鸟教程的介绍和例子过来 开发高质量软件的方法之一是为每一个函数开发测试代码,并且在开发过程中经常进行测试 ...

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

    PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块 pyUserInput模块安装前需要安装pywin32和pyHook模块.(想要装的看https://www.cnblogs.com/m ...

  8. 前端测试框架Jest系列教程 -- Mock Functions(模拟器)

    写在前面: 在写单元测试的时候有一个最重要的步骤就是Mock,我们通常会根据接口来Mock接口的实现,比如你要测试某个class中的某个方法,而这个方法又依赖了外部的一些接口的实现,从单元测试的角度来 ...

  9. py库: pyautogui (自动测试模块,模拟鼠标、键盘动作)

    PyAutoGUI 是一个人性化的跨平台 GUI 自动测试模块 pyautogui 库 2017-10-4 pip install pyautogui python pip.exe install p ...

随机推荐

  1. 使用通配符和泛型:完成父子类关系的List对象的类型匹配

    泛型和通配符 使用泛型和通配符都可以让一个方法所表示的算法逻辑适应多种类型. Java中具备继承关系的类A.B(A extends B)它们的集合List<A>和List<B> ...

  2. MapReduce多种join实现实例分析(一)

    一.概述    对于RDBMS中的join操作大伙一定非常熟悉,写sql的时候要十分注意细节,稍有差池就会耗时巨久造成很大的性能瓶颈,而在Hadoop中使用MapReduce框架进行join的操作时同 ...

  3. Base 底层库开源项目总结

    在Android开发中,我们经常使用一些开源的项目,一般情况下,这些开源项目都是基于开源的底层库进行的开发,以适配各自的用户场景.下面来列举一下本人收藏或Star的项目: 一.JavaCV 项目地址: ...

  4. Javascript高级编程学习笔记(62)—— 事件(6)焦点事件

    焦点事件 焦点事件会在页面元素获得或者失去焦点时触发,利用焦点事件和 document.hasFocus() 方法配合使用 以及 document.activeElement 属性配合可以知晓用户在页 ...

  5. .net的服务转移

    问题: 服务器换新,但是本来服务器部署了一些window服务,需要迁移过来 解决过程: 百度了估计几百页了,之前因为老机器挂了,写这个代码布服务的人也早就不在了,所以自己闷头苦找,一个java初级程序 ...

  6. Python学习笔记【第五篇】:基础函数

    一.函数:函数定义关键字def  后跟函数名称 def 函数名(参数):             ...     函数体     ...     返回值 案例: # 定义函数 def say_hei( ...

  7. 简单读!spring-mvc源码之url的暴露之路

    spring中,注册controller的url有多种方式: 1. 你可以啥都不都干,直接使用 @RequestMapping 注解上体路径,然后加上 <component-scan>, ...

  8. Android内存优化之内存缓存

    前言: 上面两篇博客已经讲了图片的基本知识和图片的加载方法及优化,所有的这些优化都是为了避免应用出现OOM这个问题.一个好的应用程序不仅要健壮不能出错还要方便用户使用,对于用户来说你的应用不仅要美观还 ...

  9. Java多线程之一

    进程与线程 进程 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位,比如我们windows电脑上运行的一个程序就是一个进程.在传统进程中进程是资源分配和调度的一个基本单位,在后来引入线 ...

  10. 数据量你造吗-JAVA分页

    原创地址:   http://www.cnblogs.com/Alandre/  (泥沙砖瓦浆木匠),需要转载的,保留下! Thanks 学习的心态第一,解行要相应.其实<弟子规>在“余力 ...