Mocha测试mock/spy导入库使用testdouble.js
mocha test mock/spy imported library using testdouble.js
我的模块需要一个外部的dependencies: downloadjs导出一个函数而不是Object
import download from 'downloadjs' // download is a function
我的功能const onExport = () => (dispatch, getState) => {
let data = getState().get('data')
let csv = mapDataToCsv(data)
download(csv, "export-result.csv", "text/csv");
// dispatch something else
}
单元测试import download from 'downloadjs'
import td from 'testdouble'
// test case
it('unparse JSON to CSV', () => {
td.replace('downloadjs') // no this doesn't work
let store = createStore(reducer, initialState, middleware);
store.dispatch(target.onExport()); // action calls
let expected = td.matchers.contains('FOO,SUCCESS')
// error it calls real download function not mock
td.verify(download(expected, "export-result.csv", "text/csv"))
td.reset()
})
我尝试模拟/替换downloadjs
以验证它是否使用有效数据调用。
td.replace(download)
和td.replace('downloadjs')
都不工作
文档说你不应该模拟/替换外部库:
为什么td.replace()不能与外部CommonJS模块一起工作?
那么我如何测试这段代码?
您可以围绕第三方库(在本例中为downloadjs)中存在的功能创建一个包装器,并使用td.replace
来模拟您的包装器。
函数
var downloadCSV = require('./downloadCSV.js')
module.exports = () => (dispatch, getState) => {
downloadCSV('goats')
}
新的包装器依赖项
// downloadCSV.js
var download = require('downloadjs')
module.exports = (data) => {
download(data, 'export-result.csv', 'text/csv')
}
describe('csv exporter', () => {
var subject, downloadCSV
beforeEach(() => {
downloadCSV = td.replace('../../lib/downloadCSV.js')
subject = require('../../lib/code.js')
})
describe('downloading csv', () => {
it('works', () => {
subject()()
td.verify(downloadCSV('goats'))
})
});
});
指出注意
subject()()
的双重调用,因为你在测试代码中有一个函数返回一个函数。我使用测试双repo中可用的
node
示例文件夹结构来构建这些测试:https://github.com/testdouble/testdouble.js/tree/master/examples/node我已经上传了一个带有示例代码的存储库,供您使用。https://github.com/davemo/td-replace-helper
我没有包含Redux特定的代码,也没有使用ES6风格的导入,以避免在示例repo中引入太多依赖项。
为了方便
td.replace
的使用,你可能需要修改你对ES6样式导入的使用,查看这个评论线程了解更多信息:https://github.com/testdouble/testdouble.js/issues/51#issuecomment-207780628
相关文章:
- 可以't让我的if语句处理js中的html表单输入
- 使用agility.js进行页面布局和合成
- 使用Clipboard.js复制span文本
- 使用JS如何动态更改显示的html文件中的文本背景颜色
- 强制模板刷新ember.js
- 如何编写HTML输入的JS内联
- Angular JS IE9 Hashbang url rewriting
- 使用JS将数组转换为json对象
- Node.js v6.2.0类扩展不是函数错误
- 当js函数's已执行
- 要求未定义JS回调参数
- 在自定义mean.io包中使用angular-chart.js作为依赖项
- 无法在数据endVal中设置值=“”;{{ucount}}”;使用Angular JS的CountUp
- 如何从Java/scala调用js美化程序
- 如何更改<svg>标记为<img>用js标记
- 如何使用 node.js 比较两个 json 数组
- chrome扩展:尽管运行了at:documentidle,js脚本还是过早启动
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- Selectize.js:如何对整数值的选项进行排序
- Mocha测试mock/spy导入库使用testdouble.js