【问题标题】:Which is Jest way for restoring mocked function这是恢复模拟功能的开玩笑方式
【发布时间】:2017-08-04 02:43:53
【问题描述】:

在 Sinon 的存根中恢复功能非常容易。

const stub = sinon.stub(fs,"writeFile",()=>{})
...
fs.writeFile.restore()

我希望对 Jest 做同样的事情。我得到的最接近的是这个丑陋的代码:

const fsWriteFileHolder = fs.writeFile
fs.writeFile = jest.fn()
...
fs.writeFile = fsWriteFileHolder 

【问题讨论】:

  • 您尝试过mockRestore ,它尚未记录,但它是文档中spyOn 示例的一部分。

标签: javascript testing mocking jestjs


【解决方案1】:

如果你想clear all the calls来模拟函数,你可以使用:

const myMock = jest.fn();
// ...
myMock.mockClear();

对于存储在模拟中的clear everything,请尝试:

myMock.mockReset();

【讨论】:

  • 感谢您的建议,但没有奏效。看来我必须接受我最初的丑陋解决方案。
  • @DejanToteff 似乎您正在将 fs.writeFile 函数重新定义为 jest.fn()。 mockClear 和 mockReset 用于 jest mock 函数,而不是之前定义为 fs.writeFile 的函数。您的解决方案似乎合理。重新定义后,测试结束后writeFile函数是不是没有恢复正常?这个帖子好像有关系,看看:github.com/facebook/jest/issues/936
  • 感谢您的澄清。是的,我的解决方案表现得很好。我唯一的问题是,如果在这种情况下可以使用 Jest 的恢复功能,代码会更好看。
【解决方案2】:

感谢@nbkhope 的贡献,我终于找到了一个可行的解决方案。

因此以下代码按预期工作,即它模拟代码然后恢复原始行为:

const spy = jest.spyOn(
    fs,
    'writeFile' 
  ).mockImplementation((filePath,data) => {
  ...
})
...
spy.mockRestore()

【讨论】:

  • 有趣!那 (spyOn) 是一个新功能吗?我还没有在文档中找到它。
  • 哦,没关系!我刚找到它。它是available from v19.0.0+。酷!
  • @dejan 感谢分享解决方案。但是,您的解决方案对我不起作用,因为我正在模拟 console.log。任何想法?请参阅下面的代码 const spy = jest.spyOn(global.console, 'error').mockImplementation(err => errors.push(err)); spy.mockRestore();
  • 谢谢,这个解释比 jests 网站上的文档好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-16
  • 2021-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
相关资源
最近更新 更多