【问题标题】:how does the first snapshot gets evaluated如何评估第一个快照
【发布时间】:2019-02-13 12:34:01
【问题描述】:
function sum(a,b) { return a+b;}

it("testing snapshot with sum",()=>{
  expect(sum(1,2)).toMatchSnapshot();
})

如果测试在第一次快照时返回的值不是 3,上述如何通过错误进行测试?我想它是相对比较的,但我不确定它是否可以在我们知道确切值的地方使用。

【问题讨论】:

  • toMatchSnapshot() 不做 UI 测试吗?如有错误请指正。
  • 是的,它进行 ui 测试
  • 我无法连接上述代码并使用任何 UI 功能进行测试。
  • 为什么不直接使用.toBe(3)

标签: javascript unit-testing testing jestjs


【解决方案1】:

只是为了完整:


如果 Jest 运行快照测试并且还没有快照存在,它将创建一个。来自docs

在随后的测试运行中,Jest 将简单地将渲染输出与之前的快照进行比较。如果它们匹配,则测试将通过。如果它们不匹配,则测试运行程序发现了一个错误......或者实现已更改并且需要更新快照。

注意

快照工件应与代码更改一起提交,并作为代码审查流程的一部分进行审查。

快照测试最常用于 UI 代码,但这并不意味着它只能用于 UI 代码。


对于您所描述的测试,第一次运行测试时,它将使用值 3 创建快照。

作为开发人员,您有责任确保该值正确并使用您的源代码签入快照。

最终,这与检查您是否将3 的正确值传递给.toBe(3) 之类的东西并将该断言检查到您的源代码中的过程相同。


是的,这是测试被测函数的有效方法。

话虽如此,toMatchSnapshot 的开销要比 toBe 之类的开销大得多,因此对于这样的简单测试,使用 .toBe(3) 而不是 .toMatchSnapshot() 是有意义的。

快照测试对于像 UI 这样的复杂值最有用,如果它们被内联包含并且难以准确更新,它们会使您的测试文件膨胀。通过快照测试,它们存储在一个单独的文件中,并且可以通过告诉Jest 在验证更新值正确后更新快照来轻松进行更新。

【讨论】:

  • 我想你没明白我的意思,我是说怎么可能说测试通过或不通过(假设成功通过只是因为它不及早存在本身就会使测试成为一个错误,不是吗? t it ) 在第一个快照中,与 tobe 不同,我们总是可以不管它是否失败。
  • @SaiRam 我明白你的问题。它第一次运行时不存在快照,因此Jest 只会告诉您创建了一个快照。第一次运行它永远不会失败。然后由您来确认在初始快照中存储的值Jest 是否正确。
  • 所以最初我们必须手动检查所有快照是否为真。对吧?
  • @SaiRam 完全正确。您可以在共享的 youtube 链接中看到 Jest 报告已创建快照。那时,您将检查以确保快照值正确,并将其与快照测试一起添加到源代码管理中。从那时起,任何下载您的测试的人也将获得快照文件,并且测试将按预期工作(如果结果不是 3,则失败)。
【解决方案2】:

toMatchSnapshot() 的快照测试用于测试呈现的 UI,即组件的 HTML。

如果你想做一个单元测试并测试一个函数的输出,你可以使用匹配器比如toEqual,看这个doc about Jest matchers

在你的情况下:

function sum(a, b) { return a + b; }

it("testing snapshot with sum", () => {
    expect(sum(1, 2)).toEqual(3);
})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 2013-08-06
    • 2019-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2019-07-01
    • 1970-01-01
    相关资源
    最近更新 更多