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)