【问题标题】:Symfony Testing - ClockMock / DateTimeSymfony 测试 - ClockMock / DateTime
【发布时间】:2017-03-03 20:14:58
【问题描述】:

我在为我们基于 JSON API 的应用程序创建复杂测试寻求帮助。

短问题场景:

  • 测试创建临时实体(用于比较)
  • EntityManagerMock 设置为等待 persist($temporaryEntity)
  • 使用一些参数测试调用真实方法
  • 方法创建实体并尝试保存在 mocked EM
  • 测试失败,因为时间改变了 1 秒

我们尝试使用 ClockMock,但它仅适用于被调用/用于命名空间的类。我们的方法在其他命名空间中,实体在接下来的某个地方创建。

我们正在寻找解决方案如何临时覆盖 PHP 平台 \DateTime 类 - 或技术如何将 ClockMock 用于项目中的所有命名空间/类(但仅用于测试)。我们尝试修改基于 Symfony 的 ClockMock - 但没有找到好方法:-/。

有什么办法吗? (我不想使用 get_declared_class() 之类的东西并用它调用 clockMock::register - 因为它对于大约 15.000 次测试来说非常慢:-/。

谢谢大家!

【问题讨论】:

  • "我们正在寻找如何临时覆盖 PHP 平台 \DateTime 类的解决方案。"我不是在追随你为什么需要或想要这样做。模拟它对单元测试有何帮助?
  • 你能展示一下代码的相关部分吗?
  • 很抱歉,我必须将代码粘贴到 bin:pastebin.com/ZhBMrq4P - 它已简化但主要问题存在。问题是对持久调用的期望-因为“新日期时间”有时会产生更长的时间(当测试在第二个运行时)。将所有类都注册到 ClockMock 是一种解决方案——但对于完整的项目来说,时间非常昂贵。

标签: php unit-testing symfony mocking phpunit


【解决方案1】:

ClockMock 不适用于new \DateTime(),但仅适用于基于时间的 PHP 函数。

From the announcement of the features:

这意味着您无需对您的 原始代码,除非使用new DateTime(),它必须是 替换为 DateTime::createFromFormat('U', time()) 以使用 模拟 time() 函数。

所以按照建议尝试:将任何 DateTime 对象创建替换为具有时间函数的命名构造函数。

希望有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2019-06-04
    • 2015-04-26
    • 2015-12-21
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多