我怎样才能使用JEST间谍来testing一个NodeJs模块/应用程序
我不明白如何侦测一个模块内部的方法/函数是否被触发。 这是我的例子:
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@email.com', password: 'abc123' }; app.handleSignup(user.email, user.password); expect(dbSpy).toBeCalled(); }); });
通过运行这个testing,我可以从shell中看到在saveUser()中写的console.log,所以这意味着db.saveUser()被触发,Jest不会嘲笑saveUser()。 我究竟做错了什么?
参考这里给出的手动模拟示例: https : //facebook.github.io/jest/docs/en/manual-mocks.html
jest.genMockFromModule()
实际上是在一个模拟模块文件中调用的。 即使如此,如果你嘲笑的db文件是你自己的本地文件之一,你不需要调用genMockFromModule。 我相信这只用于node_modules
文件夹和核心模块中的npm模块(例如'fs','readline'等)
那边
我一直在与Spock合作一段时间,我发现嘲笑和观察是一个试验和错误的过程。 有时你必须有一点创意,因为它不像你所期望的那样有效。
一个简单的方法,已经在多个实例中工作(我想,将在你的情况下):
创build一个模拟: ./__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@email.com', 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”文件扩展名(在某些情况下,这对我来说是个棘手的问题。
希望有所帮助!