如果比较无法满足期望,大多数Jest期望(arg1).xxxx()方法将抛出异常。这种模式的一个例外似乎是toMatchSnapshot()方法。它似乎从不抛出异常,而是存储失败信息,供以后的Jest代码处理。
我们如何让toMatchSnapshot()抛出异常?如果这不可能,我们的测试可以在快照比较失败时检测到另一种方式吗?
答案 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