Javascript 使用Jest测试第三方模块内的匿名函数

Javascript 使用Jest测试第三方模块内的匿名函数,javascript,unit-testing,jestjs,node-pg-pool,Javascript,Unit Testing,Jestjs,Node Pg Pool,我有一个非常简单的模块,它使用pg(node postgrelib)模块, 我想实现一个Jest测试,在模拟pg模块的同时,我想运行它的回调函数来查看控制台。log运行,我的回调被调用 我模拟了该模块,并试图刺探和替换“query”方法,但它失败并崩溃了, 知道我做错了什么吗 受试者: import {Pool} from 'pg'; const pool = new Pool(); module.exports = { query: (text, params, callback) =

我有一个非常简单的模块,它使用
pg
node postgre
lib)模块, 我想实现一个Jest测试,在模拟
pg
模块的同时,我想运行它的回调函数来查看
控制台。log
运行,我的回调被调用

我模拟了该模块,并试图刺探和替换“query”方法,但它失败并崩溃了, 知道我做错了什么吗

受试者:

import {Pool} from 'pg';

const pool = new Pool();

module.exports = {
  query: (text, params, callback) => {
    const start = Date.now();

    return pool.query(text, params, (err, res) => {
      const duration = Date.now() - start;
      console.log('executed query', {text, duration, rows: res.rowCount});
      callback(err, res);
    });
  }
};
测试:


谢谢

以下是单元测试解决方案:

index.js

从'pg'导入{Pool};
常量池=新池();
module.exports={
查询:(文本、参数、回调)=>{
const start=Date.now();
返回pool.query(文本,参数,(err,res)=>{
const duration=Date.now()-开始;
log('executed query',{text,duration,rows:res.rowCount});
回调(err,res);
});
}
};
index.spec.js

import mod from';
从'pg'导入{Pool};
开玩笑的模仿('pg',()=>{
常量mPool={
查询:jest.fn()
};
返回{Pool:jest.fn(()=>mPool)};
});
常量池=新池();
之后(()=>{
jest.resetAllMocks();
开玩笑。恢复记忆();
});
它('调用回调',完成=>{
让queryCallback;
pool.query.mockImplementation((文本、参数、回调)=>{
queryCallback=回调;
});
constlogspy=jest.spyOn(控制台,'log');
const userCallback=jest.fn();
mod.query('text','params',userCallback);
const mRes={rowCount:1};
查询回调(空,mRes);
expect(pool.query).toBeCalledWith('text','params',queryCallback);
expect(userCallback).toBeCalledWith(null,mRes);
expect(logSpy).toBeCalledWith('executed query',{text:'text',duration:expect.any(Number),rows:1});
完成();
});
100%覆盖率的单元测试结果:

PASS src/stackoverflow/52831401/index.spec.js
✓ 调用回调(15毫秒)
console.log node_modules/jest mock/build/index.js:860
已执行查询{text:'text',持续时间:0,行数:1}
----------|----------|----------|----------|----------|-------------------|
文件|%Stmts |%Branch |%Funcs |%Line |未覆盖行|s|
----------|----------|----------|----------|----------|-------------------|
所有文件| 100 | 100 | 100 | 100 ||
index.js | 100 | 100 | 100 | 100 ||
----------|----------|----------|----------|----------|-------------------|
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:4.026秒
源代码:

jest.mock('pg');

import module from './index';
import { Pool } from 'pg'

beforeAll(() => {
  Pool.mockImplementation(()=>{return jest.fn()});
});


  it('callback is called', () => {
    const cb = (err, res) => true;
    const query = jest.spyOn(Pool, "query");         // <---- Not right, Error
    query.mockImplementation((a,b,c) => c({},{}));
    const resolve = module.query('QUERY TEXT', { a: 1, b: 2}, cb);
    resolve();                                       // <---- Not what I expect
    expect(cb).toBeCalled();
  });
});
  20 |   it('callback is called', () => {
  21 |     const cb = (err, res) => true;
> 22 |     const query = jest.spyOn(Pool, "query");
     |                        ^
  23 |     query.mockImplementation((a,b,c) => c({},{}));
  24 |     const resolve = module.query('QUERY TEXT', { a: 1, b: 2}, cb);
  25 |     resolve();

  at ModuleMockerClass.spyOn (node_modules/jest-mock/build/index.js:697:15)
  at Object.spyOn (src/db/index.test.js:22:24)