[英]mocha test mock/spy imported library using testdouble.js
我的模塊需要一個外部依賴項: 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(download)
該文件說你不應該模擬/替換外部庫:
為什么 td.replace() 不能與外部 CommonJS 模塊一起使用?
那我該如何測試這段代碼呢?
您可以圍繞 3rd 方庫(在本例中為 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 中可用的node
示例文件夾結構來構建這些測試: https : //github.com/testdouble/testdouble.js/tree/master/examples/node
我已經上傳了一個包含我的示例代碼的存儲庫供您使用。 https://github.com/davemo/td-replace-helper
我沒有包含 Redux 特定代碼,也沒有使用 ES6 樣式導入以避免在示例存儲庫中引入太多依賴項。
您可能需要調整您對 ES6 樣式導入的使用,以便於使用td.replace
,查看此評論線程以獲取更多信息: https : //github.com/testdouble/testdouble.js/issues/51#issuecomment -207780628
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.