2017-11-18 188 views
2

我不明白如何偵測一個模塊內部的方法/函數是否被觸發。 這是我的例子:我該如何使用Jest來測試一個NodeJs模塊/ app

db.js

module.exports.saveUser = (user) => { 
    console.log('Saving the user', user); 
}; 

app.js

let db = require('./db'); 

module.exports.handleSignup = (email, password) => { 
    db.saveUser({ email, password }); 
} 

app.test.js

const db = require('./db'); 
jest.genMockFromModule('./app'); 
const app = require('./app'); 

describe('App: ',() => { 
    it('should call "db.saveUser" with a user object',() => { 
     let dbSpy = jest.spyOn(db, 'saveUser'); 
     const user = { email: '[email protected]', password: 'abc123' }; 
     app.handleSignup(user.email, user.password); 
     expect(dbSpy).toBeCalled(); 
    }); 
}); 

通過運行此測試我可以從shell中看到在saveUser()中編寫的console.log,因此它意味着db.saveUser()正在觸發並且Jest不會嘲笑saveUser()。 我在做什麼錯?

回答

0

參照這裏給出的手工模擬例如: https://facebook.github.io/jest/docs/en/manual-mocks.html

jest.genMockFromModule()實際上就是所謂的一個模擬模塊文件。即使如此,如果你正在嘲笑的那個db文件是你自己的本地文件之一,你不需要調用genMockFromModule。我認爲,只有在你的node_modules文件夾和核心模塊用於NPM模塊(如「FS」,「readline的」,等等)

的是,除了

我一直在斯波克工作一段時間,我發現嘲笑和觀察是一個試驗和錯誤的過程。有時你必須對它有一點創意,因爲它不像你所期望的那樣有效。

一個簡單的辦法,爲我在多個實例(和,我想,會在你的情況下工作)工作:

創建一個模擬: ./__mocks__/db.js(我假設db.js是在項目的底層目錄文件夾)

module.exports = { 
    fileSaveObserver: [], 
    getFileSaveObserver() { 
    return this.fileSaveObserver; 
    }, 
    saveUser (obj) { 
    this.fileSaveObserver.push(obj); 
    } 
} 

然後在./__tests__/app.test.js

jest.mock('./db.js'); 
const app = require('../app'); 

describe('App: ',() => { 
    test('should call "db.saveUser" with a user object',() => { 
    const user = { email: '[email protected]', password: 'abc123' }; 
    app.handleSignup(user.email, user.password); 
    const db = require('./db.js'); 
    const observer = db.getFileSaveObserver() 
    expect(observer.length).toBe(1) 
    expect(observer).toEqual(user); 
    }) 

如果您遇到上述問題,請嘗試刪除從jest.mock()語句和require語句中獲得'.js'文件擴展名(這在某些場合對我來說是個棘手的問題。

希望幫助!