【问题标题】:When using Faker in laravel, how to test the results of API calls?在 laravel 中使用 Faker 时,如何测试 API 调用的结果?
【发布时间】:2019-09-07 21:57:11
【问题描述】:

我想在 Laravel 中为 API 调用编写测试。我创建了一个模型工厂来播种我的测试数据库,以便 API 调用可以返回一些东西。在模型工厂内部,我使用 Faker 为模型属性生成随机数据。我在测试开始时使用这个工厂,所以数据是在运行时创建的。

如何测试 API 调用的结果?问题是在每次执行测试期间,由于随机生成的数据,API 调用可能会返回不同的结果。因此,我不能只将 APi 调用的结果保存在 .json 文件中,并将其与测试中 API 调用的实际结果进行比较。

我知道seeJsonStructure()方法(https://laravel.com/docs/5.3/application-testing#verifying-structural-match),但我不想使用它。

所以这是我目前的尝试,但不起作用:

$cars = factory(Car::class)->times(2)->create();

$this->json('GET', '/api/cars');

$expected = File::get('cars.json');

$this->seeJson((array) json_decode($expected));

【问题讨论】:

  • 不使用seeJsonStructure()的原因是什么?

标签: php laravel testing laravel-5 faker


【解决方案1】:

您可以在 Faker 中设置种子值,如 here 所述。

播种生成器

您可能希望始终获得相同的生成数据 - 例如在使用 Faker 进行单元测试时。生成器提供了一个seed() 方法,它为随机数生成器提供种子。使用相同的种子两次调用相同的脚本会产生相同的结果。

<?php
$faker = Faker\Factory::create();
$faker->seed(1234);

echo $faker->name; // 'Jess Mraz I';

这将为您在测试运行中提供一致的结果。

【讨论】:

  • 请注意,只要 faker 只创建一个模型实例,或者模型没有应该是唯一的属性,或者模型没有持久化到数据库中,这将起作用。因为很明显,faker 将始终为唯一属性使用相同的值,这将在持久化第二个模型时导致 SQL 错误。我的解决方案是在使用 faker 创建模型之前使用 PHP 的 srand(0) 函数,因此 faker 将为每个模型创建随机属性,但它们不会在您每次运行测试时发生变化。
  • @chris342423 只要您使用相同的 faker 实例并且不再次设置种子,对 faker 方法的连续调用应该返回不同的值。
猜你喜欢
  • 2018-10-23
  • 1970-01-01
  • 2016-08-04
  • 2019-10-12
  • 2016-04-18
  • 2016-07-19
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
相关资源
最近更新 更多