【问题标题】:Dynamic Snapshot Testing动态快照测试
【发布时间】:2019-08-28 08:53:20
【问题描述】:

我有一个时差函数,它获取 日期 并计算它与当前时间的差异并返回时间差异,例如:

4 days ago

现在,我在一个带有单元测试和快照测试的网页上使用了这个功能。 快照测试每天都会失败,因为明天差异将是5 days ago

在这种情况下我该怎么办?

更新:放上我的伪代码

const timeDiff = gTime => {
    return (currentTime - gtime) 
};

此函数将在我的网页、组件、评论部分和...中调用 所以我所有组件的快照测试都会失败。

【问题讨论】:

  • 您没有根据实际时间进行测试。时间是一个依赖
  • @jonrsharpe 是的,时间是一个依赖项,但此功能在我的评论组件和其他组件上,导致对包含此时间差异功能的所有页面进行快照测试失败。
  • 那么您没有正确处理该依赖关系。同样,不要根据实际时间进行测试
  • 但是您可以将其替换为测试替身,或者如以下答案所示,模拟时间本身。
  • 这对说明任何事情有何帮助? currentTime 来自哪里?为什么不能为了测试目的更换它?为什么在测试组件时不能完全替换timeDiff

标签: javascript reactjs testing snapshot


【解决方案1】:

【讨论】:

  • 这是一个错觉。我使用模拟数据,但问题仍然存在。因为我的函数会计算每秒都会改变的当前时间!!!
  • 模拟Date 对象意味着在测试运行和调用函数之前将其替换为您控制的版本,然后再将其替换为原始版本。你的函数认为它调用一个普通的Date 对象来获取当前时间,但它实际上调用了一个自定义的Date,它总是静态地返回相同的当前时间值。这是快照测试的一个非常常见的问题,因此他们在 Jest 文档中特别提到了它。阅读我在上面添加的第一个链接 :)
  • 感谢您的回复,但这不是我的答案。我知道时间和日期每秒钟都在变化,我必须嘲笑它​​们。我的问题是别的。这个函数导入到我的组件(在 ReactJS 中),它不是我可以从外部更改它并在测试文件中模拟它的道具。
  • 您是否将模拟与依赖注入混淆了?你可以模拟函数,这样当它们被导入到你的组件文件中时,它们会被你提供的函数替换jestjs.io/docs/en/manual-mocks
【解决方案2】:

您可能有两种选择:

1- 考虑如果你有一个空输入(或类似的东西),在这种情况下你的组件会返回什么,所以通过改变你的函数你可以给你的函数一个空输入并期望得到一个预期的结果。

const timeDiff = gTime => {
    if(!gTime) return "";
    return (currentTime - gtime)  };   

// ------------test---------------

timeDiff(null)

2- 提供将返回预期结果的输入,例如在您的场景中,您可以将当前时间作为输入(作为模拟数据),因此每次您的结果都会有 0 秒的差异。

const timeDiff = gTime => {
    return (currentTime - gtime) 
};

// ------------test---------------

mockData = getCurrentTime()
timeDiff(mockData)

【讨论】:

    【解决方案3】:

    我完全找到了答案。 我使用第三方库进行时间操作。我在我的 react 组件中使用了这个库(考虑在 js 文件中导入)。

    所以我无法模拟这个库的数据。

    最终,我决定从我的文件中删除这个第三库的导入,并将一个函数(在 react.js 中称为 props)传递给我的组件。

    现在我可以轻松地将模拟数据传递给这个组件,我的问题就解决了。

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 2019-10-25
      • 1970-01-01
      • 2021-10-05
      • 2019-07-13
      • 1970-01-01
      • 2021-07-13
      • 2017-10-01
      • 2011-04-09
      相关资源
      最近更新 更多