【问题标题】:how to mock a module that takes a parameter如何模拟带有参数的模块
【发布时间】: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 OptionsnoLocking
  • 谢谢,我会试试的。我现在已经有点过了。但是我现在收到 pgp 不是函数的错误。
  • 如何模拟协议?如果它可以做它的事情然后模拟数据库会更好
  • 是什么阻止您以标准方式模拟数据库?
  • 我不确定您所说的“标准方式”是什么意思。我通常这样做的方法是模拟模块,然后用 jest.fn() 实现替换我调用的函数(如上所述)。你有模拟数据库的例子吗?我已经查看了您的 wiki,但在那里看不到任何内容

标签: node.js jestjs pg-promise


【解决方案1】:

对于其他不太确定如何执行此操作的人:

const fakeDB = {
  one: jest.fn()
}

function fakePgpFunc() {
  return fakeDB
}
fakePgpFunc.end = jest.fn()

jest.doMock("pg-promise", () => {
  return jest.fn(() => fakePgpFunc)
})

const insertStuff = require("../src/db-utils").insertStuff

beforeEach(() => {
  jest.clearAllMocks()
})

test("params for inserting stuff are correct", done => {
  fakeDB.one.mockImplementationOnce(() => {
    return Promise.resolve({"stuff": "Stuff", "id": 123456789})
  })

  insertStuff("Stuff").then((data) => {
    expect(fakeDB.one).toHaveBeenCalledTimes(1)
    const insertStuffCall = fakeDB.one.mock.calls[0]
    expect(insertStuffCall[0]).toEqual("INSERT INTO test(stuff) VALUES ($1) RETURNING id, stuff")
    expect(queryInsertCall[1]).toEqual(["Stuff"])
    expect(data).toEqual({id: 123456789, stuff: "Stuff"})
    expect(fakePgpFunc.end).toHaveBeenCalledTimes(1)
    done()
  })
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多