Javascript 使用testdouble.js导入的mocha测试模拟/间谍库

Javascript 使用testdouble.js导入的mocha测试模拟/间谍库,javascript,node.js,unit-testing,Javascript,Node.js,Unit Testing,我的模块需要一个外部依赖项:导出函数而不是对象 import download from 'downloadjs' // download is a function 我的职能 单元测试 问题 我尝试模拟/替换downloadjs,以验证它是否使用有效数据调用 td.replace(下载)和td.replace('downloadjs')都不起作用 文档中说您不应该模拟/替换外部库: 那么如何测试这段代码呢?您可以围绕第三方库中存在的功能创建一个包装器(本例中为downloadjs),并使用

我的模块需要一个外部依赖项:导出函数而不是对象

import download from 'downloadjs' // download is a function
我的职能 单元测试 问题 我尝试模拟/替换
downloadjs
,以验证它是否使用有效数据调用

td.replace(下载)
td.replace('downloadjs')
都不起作用

文档中说您不应该模拟/替换外部库:


那么如何测试这段代码呢?

您可以围绕第三方库中存在的功能创建一个包装器(本例中为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()

  • 我使用test double repo中可用的
    节点
    示例文件夹结构来构造这些测试:

  • 我上传了一个带有示例代码的存储库,供您使用

  • 我没有包含特定于Redux的代码,也没有使用ES6风格的导入来避免在示例repo中引入太多依赖项

  • 为了方便使用
    td,您可能需要调整ES6样式导入的使用。请查看此评论线程以了解更多信息:


  • 谢谢你提供了清晰的例子。因此,包装器是不稳定的(需要集成测试),但对我来说是有意义的:)包装器可以通过使用
    td.replace
    在隔离/单元测试中进行测试,但是如果您想验证
    downloadjs
    的实际功能,则需要一个更集成的测试,跨越该边界。
    // 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'))
            })
        });
    });