gpt4 book ai didi

PHPUnit 测试运行得太快,导致 MySQL 时间戳没有任何区别

转载 作者:行者123 更新时间:2023-11-29 23:20:00 25 4
gpt4 key购买 nike

我有一个 PHP 类,当我创建它的新实例时,它会在 MySQL 数据库中创建带有 CURRENT_TIMESTAMPS 的行。然后使用该时间戳对这些记录进行排序(主要是获取最后一条记录)。

在这种情况下,时间戳是 Eloquent (Laravel) 模型自动生成的 created_at 列。如果可能的话,我想要一个不特定于 Laravel 的解决方案,因为我可能会在其他项目中遇到同样的问题。

我在另一台 PC 上为此类编写了测试,一切正常,生成的顺序始终正确。

现在,我将这个项目复制到我的另一台具有 SSD 的 PC 上,并且比另一台 PC 更强大(但不是很多)。现在,我的所有测试都失败了,因为所有记录最终都具有完全相同的时间戳。

在生产中,如果两条记录具有相同的时间戳(这不太可能),那么不会成为问题,但这不是我在测试中尝试复制的情况。

为了快速解决问题而不需要深入代码,我在实例化新对象之前添加了一些 sleep(1) 函数。

但现在我的问题是,处理这个问题的最佳方法是什么?

以下是我想到的几种可能性,但我不确定哪一种是最好的:

  • 对测试中的日期进行硬编码:没有失败的风险,但我的对象目前无法提供手动定义日期的方法。我需要为此添加方法,并且它们不会用于其他任何用途。
  • 在执行下一步操作之前清空数据库。问题是,对于某些测试,我需要一个接一个地插入两个对象,所以它不能解决所有问题
  • 让代码等待。但这对我来说听起来很愚蠢,因为我失去了拥有一台强大机器的所有好处。当然,运行测试需要更多时间
  • 操纵系统或数据库的当前时间。我不知道如果我尝试这样做会发生什么可怕的事情!也许可以隔离一个进程来执行此操作而不影响 PC 上的其他任何内容?

那么您推荐哪种方法?还有更好的吗?

更多系统信息:我的所有开发机器都运行 Ubuntu 14.04、PHP 5.5 和 MySQL 5.5。我当前的项目使用 Laravel 4 框架和 phpunit 进行测试

其他信息

我想补充一下我在下面评论中所说的话。理想情况下,我的测试应该使用间隔多个小时的日期进行断言,但目前我依赖于两个记录至少有一秒差异的事实,而其他 PC 配置则不再出现这种情况。

并且,附加信息,在生产中,旧记录通常会在插入新记录或查询数据库之前被删除(例如,90% 的时间),因此即使快速创建了两条记录,也有可能在我对数据库进行逻辑处理之前,其中一个已被删除。但对于我的测试,我需要在数据库中至少有两条记录,间隔一段时间,这并不重要,但大于零。

最佳答案

我找到了一个仅适用于 Eloquent 的好解决方案。

这与数据库种子所使用的相同。

我们可以在测试中实例化对象之前添加 Eloquent::unguard() :

Eloquent::unguard();

Model::create(array('created_at' => '2014-12-17'));

因此,我们可以手动设置模型的 created_at 字段,而不会将其暴露给使用该类的“每个人”。

关于PHPUnit 测试运行得太快,导致 MySQL 时间戳没有任何区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27408747/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com