Ресурсы Laravel переносятся дважды при модульном тестировании - PullRequest
0 голосов
/ 27 марта 2019

Когда я запускаю тестовый костюм, мои тесты, которые возвращают 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 Но это очень медленно

1 Ответ

0 голосов
/ 28 марта 2019

Я не удовлетворен своим ответом, но он исправит ошибку, если я вручную установлю $wrap в ResourceCollection.

class OrganizationsResource extends ResourceCollection
{
    public static $wrap = 'data';

    /**
     * @param Request $request
     * @return array
     */
    public function toArray($request): array
    {
        return [
            'data' => OrganizationResource::collection($this->collection),
        ];
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...