Когда я запускаю тестовый костюм, мои тесты, которые возвращают ResourceCollection
, терпят неудачу, потому что данные переносятся дважды, но успешно, когда я запускаю их по отдельности.
Я уже знаю причину
ResourceCollection
использовать статическую переменную с именем wrap и между тестами эта переменная сохранит егогосударство.
Теперь мне нужно это исправить
Взять эти два метода в качестве отправной точки в OrganizationsController
/**
* @param Request $request
* @return OrganizationsResource
*/
public function index(Request $request): OrganizationsResource
{
return new OrganizationsResource(
Organization::paginate()
);
}
/**
* @param Request $request
* @param Organization $organization
* @return OrganizationResource
*/
public function show(Request $request, Organization $organization): OrganizationResource
{
OrganizationResource::withoutWrapping();
return new OrganizationResource($organization);
}
OrganizationsResource
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\ResourceCollection;
class OrganizationsResource extends ResourceCollection
{
/**
* @param Request $request
* @return array
*/
public function toArray($request): array
{
return [
'data' => OrganizationResource::collection($this->collection),
];
}
}
И OrganizationResource
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\Resource;
class OrganizationResource extends Resource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'id' => $this->id,
'type' => 'organization',
'attributes' => [
'name' => $this->resource->name,
],
];
}
}
Это прекрасно работает ответ, данный для index будет построен следующим образом:
{
"data": [
{"id": 1},{"id": 2}, ....
],
"links": {
"next": "http://...",
....
},
"meta": {
"current_page": 1,
....
}
}
И, как и ожидалось, show вернет
{
"id": 1,
"type" "organization",
....
}
Однако , когда я запускаю все свои модульные тесты, мой index (es) возвращает следующий json (уведомление {"data":{"data"...
{
"data": {
"data": [
{"id": 1},{"id": 2}, ....
],
"links": {
"next": "http://...",
....
},
"meta": {
"current_page": 1,
....
}
}
}
Вот один из тестов, который успешно выполняется при запуске в одиночкуно потерпите неудачу после withoutWrapping
, как однажды был вызван в тестовом костюме
/** @test */
public function organizations_api_index_returns_valid_schema(): void
{
factory(Organization::class, 2)->create(['name' => 'My-Company']);
$this->json('get', '/organizations')->assertJsonSchema(base_path("{$this->schema}/organizations.json"));
}
В случае, если вам интересно узнать о assertJsonSchema
это из Sixlive / Laravel-JSON-схема-утверждения
Временное решение
Я запускаю свои тесты с processIsolation
, установленным на true
в моем phpunit.xml Но это очень медленно