来源:https://blog.fundebug.com/2017/12/27/npm-rewire-tutorial/

在玩转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来实现,更为直观,因此本文不再介绍。

使用rewire模块测试私有方法相关推荐

  1. 使用Sinon和Rewire对JavaScript中的私有方法进行单元测试

    我们曾经试图遵循良好的编程习惯,在创建和定义方法时尽可能按照"职责单一"和"开放-封闭"原则将那些没有必要暴露出来的方法定义为私有方法,但是在编写测试用例时又往 ...

  2. js基础知识温习:Javascript中如何模拟私有方法

    本文涉及的主题虽然很基础,在很多人眼里属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题.这里会涉及到对象属性的封装.原型.构造函数.闭包以及立即执行表达式等知识. 公有方法 公有方法 ...

  3. python 类 公有属性、私有属性、公有方法、私有方法

    python 类 公有属性.私有属性.公有方法.私有方法 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Int ...

  4. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  5. python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...

    python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...

  6. 为什么Python的“私有”方法实际上不是私有的?

    Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示: __myPrivateMethod() . 那么,如何解释这一点呢 >>> ...

  7. Object-C 有私有变量?私有方法?

    从object-c 动态编译机制上讲是不存在私有变量和私有方法的.但是如果你不在.h中声明变量和方法在其它地方无法访问这些变量和方法,那么就成了私有的了.私有变量也可以使用@prviter进行修饰. ...

  8. JUnit 3.8 通过反射测试私有方法

    测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...

  9. 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)

    一. 私有属性(封装) # 侠义 上的封装 面向对象的三大特性之一 # 属性 和 方法都隐藏起来 不让你看到 # 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 ...

最新文章

  1. linux wc 命令简介
  2. gcd(辗转相除法)
  3. 红帽linux登陆错误,xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
  4. java 无符号 类型_java中符号类型和无符号类型的问题分析
  5. OpenCASCADE:Foundation Classes数据类型
  6. Angular6_服务端渲染SSR
  7. 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名 ....
  8. 一步步实现SDDC-双节点VSAN部署
  9. rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...
  10. SpringBoot配置文件映射到JavaBean
  11. VirtualBox基础使用
  12. 超级楼梯HDU2041
  13. length()函数_奇怪的Haskell实验——length的实现是?
  14. iis无法启动万维网发布服务W3SVC
  15. 一个简单的跑酷引擎-------bibibibi
  16. 模型思考笔记2—分类和同群效应带来的思考
  17. 《算法竞赛进阶指南》刷题记录
  18. mybatis一对多 多对一
  19. ads1258_ADS1258:高精度多通道模/数转换芯片
  20. Mybatis3基础示例

热门文章

  1. 坐姿不良?腰背不适?你缺一把得力普乐士办公家具
  2. canvas合并两张图片--前端
  3. java GUI(鼠标键盘事件)
  4. Python OpenCV 人脸识别
  5. Windows系统中删除MySQL服务
  6. Spring中的RowMapper接口的作用
  7. 微信小程序map组件展示当前位置修改标记点图标
  8. 中药cro公司|医疗器械cro公司|医药CRO公司分别有哪些?
  9. 国网×弘玑 | RPA培训课程提升员工数字素养
  10. 女孩的第一声老公意味这什么!