簡體   English   中英

mocha 使用 testdouble.js 測試模擬/間諜導入的庫

[英]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'))
        })
    });
});

筆記

  1. 請注意對subject()()的雙重調用,因為您有一個函數,該函數在您的測試代碼中返回一個函數。

  2. 我使用 test double repo 中可用的node示例文件夾結構來構建這些測試: https : //github.com/testdouble/testdouble.js/tree/master/examples/node

  3. 我已經上傳了一個包含我的示例代碼的存儲庫供您使用。 https://github.com/davemo/td-replace-helper

  4. 我沒有包含 Redux 特定代碼,也沒有使用 ES6 樣式導入以避免在示例存儲庫中引入太多依賴項。

  5. 您可能需要調整您對 ES6 樣式導入的使用,以便於使用td.replace ,查看此評論線程以獲取更多信息: https : //github.com/testdouble/testdouble.js/issues/51#issuecomment -207780628

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM