【发布时间】:2020-08-31 08:19:12
【问题描述】:
我正在针对查询 mysql 数据库的路由运行 supertest + jest,在本地运行。通过失眠测试返回正确的信息,但我的数据库查询在使用 supertest 时都没有返回正确的值。
// test.js
import request from 'supertest';
import db from '../database';
import app from './app';
describe('/', () => {
test('should return db results', async () => {
const mock = jest.spyOn(db, 'query');
const response = await request(app).get(`/`)
console.log(response.error);
expect(dbMock).toBeCalled();
expect(response.status).toBe(200);
});
});
// route (excerpt from app.js)
import returnUserInfo from './returnUserInfo';
app.get(
'/',
returnUserInfo
);
// returnUserInfo.js
import db from '../database';
export default async function returnUserInfo(req, res, next) {
const sql = 'select `userInfo` from `users` where `email` = ?';
const bindings = ['test'];
try {
const data = await db.query(sql, bindings);
if (data.length !== 1) {
throw new Error(`Invalid ${Object.keys(data)}`);
}
return res.json(data[0]);
} catch (err) {
return next(err);
}
}
// database.js
import { PoolConnection } from 'mysql';
const db = new PoolConnection(
{
host: 'localhost',
user: 'root',
password: 'foobar',
database: 'db',
connectionLimit: 100,
},
false,
);
export default db;
如前所述,使用 postman/insomnia 进行测试会返回正确的结果... 使用 supertest 进行测试并记录错误时:
Error: Invalid sql,bindings
【问题讨论】:
-
在您检查 dbMock 上的预期调用时,您的 spyOn const 被命名为 mock。你确定这不是错字吗?
-
感谢@happyhardik,这是转移到 SO 时的拼写错误。真正的问题是手动模拟数据库模块,它阻止了任何实际查询访问数据库。不过再次感谢!
标签: mysql node.js jestjs supertest