我怎样才能使用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”文件扩展名(在某些情况下,这对我来说是个棘手的问题。

希望有所帮助!