使用rewire模块测试私有方法
来源: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模块测试私有方法相关推荐
- 使用Sinon和Rewire对JavaScript中的私有方法进行单元测试
我们曾经试图遵循良好的编程习惯,在创建和定义方法时尽可能按照"职责单一"和"开放-封闭"原则将那些没有必要暴露出来的方法定义为私有方法,但是在编写测试用例时又往 ...
- js基础知识温习:Javascript中如何模拟私有方法
本文涉及的主题虽然很基础,在很多人眼里属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题.这里会涉及到对象属性的封装.原型.构造函数.闭包以及立即执行表达式等知识. 公有方法 公有方法 ...
- python 类 公有属性、私有属性、公有方法、私有方法
python 类 公有属性.私有属性.公有方法.私有方法 #!/usr/bin/env python # -*- encoding: utf-8 -*- """ @Int ...
- abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...
在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...
- python定义私有变量的方法_Python怎么修改私有属性 如何访问python类中的私有方法...
python 类为什么不能定义私有属性和方法 因为b.name[0] = 'zhang'修改的是类属性,类属性是全局的,所有的实例共享,如果想私有化,可以添加 def __init__( self ) ...
- 为什么Python的“私有”方法实际上不是私有的?
Python使我们能够通过在名称前加上双下划线来在类中创建"私有"方法和变量,如下所示: __myPrivateMethod() . 那么,如何解释这一点呢 >>> ...
- Object-C 有私有变量?私有方法?
从object-c 动态编译机制上讲是不存在私有变量和私有方法的.但是如果你不在.h中声明变量和方法在其它地方无法访问这些变量和方法,那么就成了私有的了.私有变量也可以使用@prviter进行修饰. ...
- JUnit 3.8 通过反射测试私有方法
测试私有(private)的方法有两种: 1)把目标类的私有方法(修饰符:private)修改为(public),不推荐,因为修改了源程序不佳 2)通过反射 (推荐) 代码演示: 目标程序 Priva ...
- 三. python面向对象(私有属性和私有方法 私有静态方法 私有类方法)
一. 私有属性(封装) # 侠义 上的封装 面向对象的三大特性之一 # 属性 和 方法都隐藏起来 不让你看到 # 如果要让内部属性不被外部属性直接访问 在属性前加上两个下划线__ # 在python中 ...
最新文章
- linux wc 命令简介
- gcd(辗转相除法)
- 红帽linux登陆错误,xmanager连接RedHat出错:/usr/X11R6/bin/xterm: No such file or directory
- java 无符号 类型_java中符号类型和无符号类型的问题分析
- OpenCASCADE:Foundation Classes数据类型
- Angular6_服务端渲染SSR
- 使用.net FtpWebRequest 实现FTP常用功能 上传 下载 获取文件列表 移动 切换目录 改名 ....
- 一步步实现SDDC-双节点VSAN部署
- rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...
- SpringBoot配置文件映射到JavaBean
- VirtualBox基础使用
- 超级楼梯HDU2041
- length()函数_奇怪的Haskell实验——length的实现是?
- iis无法启动万维网发布服务W3SVC
- 一个简单的跑酷引擎-------bibibibi
- 模型思考笔记2—分类和同群效应带来的思考
- 《算法竞赛进阶指南》刷题记录
- mybatis一对多 多对一
- ads1258_ADS1258:高精度多通道模/数转换芯片
- Mybatis3基础示例