【发布时间】:2018-03-25 16:38:19
【问题描述】:
我正在尝试为使用 pg-promise 的代码编写单元测试,它看起来像这样:
const pgp = require('pg-promise')();
const cn = {
host: process.env.DB_HOST,
port: 5432,
database: process.env.DB_NAME,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD
};
function insertStuff(stuff) {
let db = pgp(cn);
return db.one('INSERT INTO test(stuff) VALUES ($1) RETURNING id, stuff', [stuff])
.then(data => {
return data
})
}
module.exports.insertStuff = insertStuff
测试代码如下所示:
const mockFakeDb = {
one: jest.fn()
}
jest.mock("pg-promise", () => {
return mockFakeDb
})
const insertStuff = require("../src/db-utils").insertStuff
test("params for inserting stuff are correct", done => {
mockFakeDb.one.mockImplementationOnce(() => {
return Promise.resolve({id: 123456789, stuff: "stuff"})
insertStuff("stuff").then((data) => {
const insertCall = fakeDb.one.mock.calls[0]
expect(insertCall).toHaveBeenCalledTimes(1)
done()
})
})
所以在尝试模拟 pg-promise 时需要我得到一个错误:
TypeError: require(...) 不是函数。
我可以看到 pg-promise 有一个带参数的函数(第二个括号),但不知道现在如何模拟它?
【问题讨论】:
-
尚不清楚
TypeError: require(...)的来源。此外,如果您要模拟协议,则应使用来自Intialization Options 的noLocking。 -
谢谢,我会试试的。我现在已经有点过了。但是我现在收到 pgp 不是函数的错误。
-
如何模拟协议?如果它可以做它的事情然后模拟数据库会更好
-
是什么阻止您以标准方式模拟数据库?
-
我不确定您所说的“标准方式”是什么意思。我通常这样做的方法是模拟模块,然后用 jest.fn() 实现替换我调用的函数(如上所述)。你有模拟数据库的例子吗?我已经查看了您的 wiki,但在那里看不到任何内容
标签: node.js jestjs pg-promise