Я пишу некоторые функциональные тесты для моего приложения Laravel.Я новичок в TDD, так что это может показаться очевидным для некоторых.
LocationsFactory.php
use Faker\Generator as Faker;
$factory->define(App\Location::class, function (Faker $faker) {
return [
'name' => $faker->name,
];
});
LocationsTest.php
public function a_user_can_create_a_location(): void
{
$this->withExceptionHandling();
$user = factory(User::class)->make();
$location = factory(Location::class)->make();
$response = $this->actingAs($user)->post('/locations', $location); // $location needs to be an array
$response->assertStatus(200);
$this->assertDatabaseHas('locations', ['name' => $location->name]);
}
Ошибка типа: аргумент 2 принятдля подсветки \ Foundation \ Testing \ TestCase :: post () должен иметь тип массива, объект задан
Я понимаю, что ошибка говорит мне, что $location
должен быть массивом, и этообъект.Тем не менее, поскольку я использую фабрику, она становится объектом.Есть ли лучший способ использовать фабрику в моем тесте?
Это также выглядит немного не так:
$this->assertDatabaseHas('locations', ['name' => $location->name]);
Поскольку я использую фейкер, я не знаю, что за name
будет.Так что я просто проверяю, что было сгенерировано, это идеально?
Спасибо за любые предложения!
РЕДАКТИРОВАТЬ
Делать что-то вроде этого работаетхорошо (и, возможно, это решение) ...
...
$user = factory(User::class)->make();
$location = factory(Location::class)->make();
$response = $this->actingAs($user)->post('/locations', [
'name' => $location->name
]);
$response->assertStatus(200);
$this->assertDatabaseHas('locations', ['name' => $location->name]);
Однако, скажем, мой location
имеет 30 атрибутов.Кажется, что это может быть ужасно быстро.