我如何使用Jest的间谍来测试NodeJs模块/应用程序

时间:2017-11-18 11:36:08

标签: node.js unit-testing mocking jestjs

我不明白如何监视模块中是否触发了方法/函数。 这是我的例子:

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();
    });
});

通过运行此测试,我可以从shell中看到用saveUser()编写的console.log,这意味着db.saveUser()正在触发,而Jest没有模拟saveUser()。 我做错了什么?

1 个答案:

答案 0 :(得分:0)

参考这里给出的手动模拟示例: https://facebook.github.io/jest/docs/en/manual-mocks.html

jest.genMockFromModule()实际上是在模拟模块文件中调用的。即便如此,如果您要模拟的db文件是您自己的本地文件之一,那么您也不需要调用genMockFromModule。我相信这只用于node_modules文件夹和核心模块中的npm模块(例如' fs',' readline'等)

除了

我已经和Spock合作了一段时间,我发现了嘲笑和观察,这是一个试错过程。有时你必须对它有点创意,因为它没有像你期望的那样表现得很好。

一种简单的方法,在多个实例中对我有用(而且,我认为,在你的情况下会起作用):

创建一个模拟: ./__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);
  })

如果您遇到上述问题,请尝试删除' .js'来自jest.mock()语句和require语句的文件扩展名(在某些情况下这对我来说是个问题。

希望有所帮助!