Jest toMatchSnapshot没有抛出异常

时间:2018-03-14 18:29:07

标签: jestjs

如果比较无法满足期望,大多数Jest期望(arg1).xxxx()方法将抛出异常。这种模式的一个例外似乎是toMatchSnapshot()方法。它似乎从不抛出异常,而是存储失败信息,供以后的Jest代码处理。

我们如何让toMatchSnapshot()抛出异常?如果这不可能,我们的测试可以在快照比较失败时检测到另一种方式吗?

3 个答案:

答案 0 :(得分:3)

这将起作用!运行toMatchSnapshot断言后,检查全局状态:expect(global[GLOBAL_STATE].state.snapshotState.matched).toEqual(1);

仅花了最后一个小时就试图为我们自己的测试弄清楚。尽管Jest的维护者也许可以告诉我访问Symbol.for('$$jest-matchers-object')是否是一个好主意,但是这对我来说也并不客气。这是上下文的完整代码段:

const GLOBAL_STATE = Symbol.for('$$jest-matchers-object');

describe('Describe test', () => {
  it('should test something', () => {
    try {
      expect({}).toMatchSnapshot(); // replace with whatever you're trying to test
      expect(global[GLOBAL_STATE].state.snapshotState.matched).toEqual(1);
    } catch (e) {
      console.log(`\x1b[31mWARNING!!! Catch snapshot failure here and print some message about it...`);
      throw e;
    }
  });
});

答案 1 :(得分:0)

如果你运行一个包含toMatchSnapshot匹配器的测试(例如/Foobar.test.js),默认情况下会在第一次运行时创建一个快照文件(例如/__snapshots__/Foobar.test.js.snap )。 创建快照的第一次运行将通过。

如果您希望测试失败,则需要将快照与测试一起提交。 下一个测试版本将比较您对已提交的快照所做的更改,如果它们不同,则测试将失败。

以下是使用Jest进行“快照测试”文档的官方link

答案 2 :(得分:0)

当存在快照不匹配时,导致toMatchSnapshot抛出异常的一种不太理想的方法是编辑toMatchSnapshot的实现。有经验的Node开发人员会认为这是一种不好的做法,但是如果你非常积极地让这种方法抛出异常,这种方法实际上很简单,取决于你如何定期更新你的工具,只是有点容易出错。

感兴趣的文件将命名为“node_modules / jest-snapshot / build / index.js”。

感兴趣的线是方法的第一行:

const toMatchSnapshot = function (received, testName) {
    this.dontThrow && this.dontThrow();   const

    currentTestName = ....

您需要拆分第一行并省略 this.dontThrow()的调用。生成的代码应该类似于:

const toMatchSnapshot = function (received, testName) {
    //this.dontThrow && this.dontThrow();
    const

    currentTestName = ....

您可能想要采取的最后一步是向Jest团队发送功能请求,或支持您喜欢的现有功能请求,如下所示:link