Jestjs 使用Jest,如何检查模拟函数中传递的参数

Jestjs 使用Jest,如何检查模拟函数中传递的参数,jestjs,Jestjs,我正在尝试使用Jest模拟和监视节点\模块库,但我需要支持: 这是要测试的代码 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.

我正在尝试使用Jest模拟和监视节点\模块库,但我需要支持:

这是要测试的代码

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)
现在测试它

\uuuuu mock\uuuu/mailgun-js.js
tests/test.js

现在toHaveBeenCalledTimes和toHaveBeenCalledWith工作,但我还要检查传递给的参数。send(data)

您可以在模拟中监视
send
函数,然后在运行
add(data)

像这样:

const mailgun=require('mailgun-js')
const mockSend=jest.fn(()=>Promise.resolve());
jest.mock('mailgun-js',()=>{
return jest.fn(()=>({
消息:()=>({
发送:mockSend
})
}))
})
测试('test',()=>{
常量添加=需要('./add');
期望(邮枪)。被催缴的时间(1)
期待(邮枪)被收缴({
apiKey:process.env.MAIL\u GUN\u API\u KEY,
域:process.env.MAIL\u GUN\u域,
主机:process.env.MAIL\u GUN\u主机
});
常量数据={foo:'bar'};
添加(数据);
期望(mockSend).已被(数据)调用;
});
请注意-如果将
mockSend
名称更改为不带前缀的名称
mock
,则会出现错误:

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


这个?通过这种方式,我只能检查直接传递给mailgun(apikey、domain和host)的参数,但不能检查传递给send()的参数。我添加了一个答案…哦,它很有效!!!非常感谢。我刚刚尝试了一个类似的解决方案,但是没有前缀
mock
,我得到了超出范围的错误。这就是为什么我提到:)这一行
需要('./add')
什么?这是不是由jest提供的?@malat这是OP想要测试的模块。
const mailgun = require('mailgun-js')
jest.genMockFromModule('mailgun-js')
module.exports = mailgun
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
})