node.js - 如何将 Spies 与 Jest 一起使用来测试 NodeJs 模块/应用程序

标签 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()。 我做错了什么?

最佳答案

引用此处给出的手动模拟示例: https://facebook.github.io/jest/docs/en/manual-mocks.html

jest.genMockFromModule() 实际上是在模拟模块文件中调用的。即便如此,如果您正在模拟的数据库文件是您自己的本地文件之一,则无需调用 genMockFromModule。我相信这仅用于 node_modules 文件夹中的 npm 模块和核心模块(例如“fs”、“readline”等)

除此之外

我和 Spock 合作已经有一段时间了,我发现 mock 和观察是一个试错过程。有时您必须对其进行一些创意,因为它的性能并不完全符合您的预期。

一种在多种情况下对我有效的简单方法(并且我想,也适用于您的情况):

创建一个模拟: ./__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”文件扩展名(这在某些情况下对我来说是一个陷阱。

希望有帮助!

关于node.js - 如何将 Spies 与 Jest 一起使用来测试 NodeJs 模块/应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47365589/

相关文章:

angular - 在 Jasmine 中测试具有构造函数方法的 Angular2 管道

r - 如何测试列表是否相等(无论顺序如何)?

python - 编译AggregatorV2V3Interface导致TypeError : Interfaces cannot inherit.接口(interface)

c# - 无法使用 Rhino Mocks 使用具有数组参数的构造函数模拟类

Python使用类似于模拟补丁的技术缓存内部调用

javascript - 无法使用 Orientjs 查询 OrientDB

javascript - 逗号在 Node.js 中是必需的吗?

java - 使用 Spring 测试 lambda express 出现异常

Javascript 删除 forEach 中的元素

node.js - 如何更改 sails 中的图标?