如何使用PHP单元测试避免竞争条件

如何使用PHP单元测试避免竞争条件,php,laravel,testing,laravel-5,phpunit,Php,Laravel,Testing,Laravel 5,Phpunit,让我们从证明这是我在这里面临的比赛条件开始: 失败的测试用例❌ 下面是运行和成功的相同测试,没有任何代码更改: 成功的测试用例✅ 在失败发生的地方我有这样的测试,没有种族条件问题 $response = $this->get('/some/api/call'); $response->assertSessionHas('order'); $this-assertDatabaseHas('orders', [ 'collect_cash' => $order->

让我们从证明这是我在这里面临的比赛条件开始:

失败的测试用例❌ 下面是运行和成功的相同测试,没有任何代码更改:

成功的测试用例✅
在失败发生的地方我有这样的测试,没有种族条件问题

$response = $this->get('/some/api/call');

$response->assertSessionHas('order');

$this-assertDatabaseHas('orders', [
    'collect_cash'  => $order->final_total + $chargeFare,
    'id'            => $order->id,
    'final_total'   => $order->final_total,
]);

有趣。。你能提供
assertDatabaseHas
的文档参考吗?该死的人。。这仅在Laravel 5.5中提供!我在5点3分。。。这是升级的另一个原因。但这还不够好。。如果您告诉我在使用
assertDatabaseHas
之前您有比赛条件,我会更高兴。。用这种方法解决了你的问题。。现在你只是告诉我:嘿,伙计,我没有比赛条件!好吧,这对你有好处:)我认为你有竞争条件是因为执行请求的方式,而不是数据库断言。类似于
发送此请求并检查数据库,即使请求尚未完成
$ phpunit --filter method class path/to/testFile.php
PHPUnit 5.7.26 by Sebastian Bergmann and contributors.

.                                                                   1 / 1 (100%)

You should really fix these slow tests (>500ms)...
 1. 1631ms to run testClass::testMethod

Time: 1.68 seconds, Memory: 22.00MB
$response = $this->get('/some/api/call');

$response->assertSessionHas('order');

$this-assertDatabaseHas('orders', [
    'collect_cash'  => $order->final_total + $chargeFare,
    'id'            => $order->id,
    'final_total'   => $order->final_total,
]);