【问题标题】:Using Jest, how to check arguments passed in a mocked function使用 Jest,如何检查在模拟函数中传递的参数
【发布时间】:2019-12-01 06:14:17
【问题描述】:

我正在尝试使用 Jest 来模拟和监视 node_modules 库,但我需要支持:

这是要测试的代码

const mailgun = require('mailgun-js')

const mg = mailgun({
  apiKey: process.env.MAIL_GUN_API_KEY,
  domain: process.env.MAIL_GUN_DOMAIN,
  host: process.env.MAIL_GUN_HOST
})

module.exports = (data) => mg.messages().send(data)

现在测试一下

__mock__/mailgun-js.js
const mailgun = require('mailgun-js')
jest.genMockFromModule('mailgun-js')
module.exports = mailgun
tests/test.js
const mailgun = require('mailgun-js')

jest.mock('mailgun-js', () => {
  return jest.fn(() => ({
    messages: () => ({
      send: jest.fn(() => Promise.resolve())
    })
  }))
})

expect(mailgun).toHaveBeenCalledTimes(1)
expect(mailgun).toHaveBeenCalledWith({
  apiKey: process.env.MAIL_GUN_API_KEY,
  domain: process.env.MAIL_GUN_DOMAIN,
  host: process.env.MAIL_GUN_HOST
})

现在 toHaveBeenCalledTimes 和 toHaveBeenCalledWith 有效,但我也会检查传递给 .send (data) 的参数

【问题讨论】:

  • 通过这种方式,我只能检查直接传递给 mailgun 的参数(apikey、域和主机),但不能检查传递给 send() 的参数
  • 你是对的。我添加了一个答案..

标签: jestjs


【解决方案1】:

您可以在您的模拟中窥探send 函数,然后在您运行add(data) 时验证itHaveBeenCalled

像这样:

const mailgun = require('mailgun-js')
const mockSend = jest.fn(() => Promise.resolve());

jest.mock('mailgun-js', () => {
  return jest.fn(() => ({
    messages: () => ({
      send: mockSend
    })
  }))
})

test('test', () => {
  const add = require('./add');
  expect(mailgun).toHaveBeenCalledTimes(1)
  expect(mailgun).toHaveBeenCalledWith({
    apiKey: process.env.MAIL_GUN_API_KEY,
    domain: process.env.MAIL_GUN_DOMAIN,
    host: process.env.MAIL_GUN_HOST
  });

  const data = {foo: 'bar'};
  add(data);
  expect(mockSend).toHaveBeenCalledWith(data);
});

注意 - 如果您将 mockSend 名称更改为不带前缀 mock 的名称,您将收到错误消息:

jest.mock() 的模块工厂不允许引用任何超出范围的变量。

【讨论】:

  • 哦,它有效!谢谢。我刚刚尝试了一个类似的解决方案,但没有前缀mock,我得到了超出范围的错误。
  • 这就是我提到的原因:)
  • require('./add') 这一行是什么?这是jest 提供的东西吗?
  • @malat 这是 OP 想要测试的模块。
猜你喜欢
  • 2018-04-04
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多