我该如何使用Jest来测试一个NodeJs模块/ app

我该如何使用Jest来测试一个NodeJs模块/ app

问题描述:

我不明白如何侦测一个模块内部的方法/函数是否被触发。 这是我的例子:我该如何使用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()。 我在做什么错?

参照这里给出的手工模拟例如: 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'文件扩展名(这在某些场合对我来说是个棘手的问题。

希望帮助!