заказать тест phpunit - PullRequest
       3

заказать тест phpunit

0 голосов
/ 25 февраля 2020

У меня есть тест phpunit, который используется для проверки порядка фильмов, мне нужно проверить, что запрос, который у меня есть ниже, возвращает и заказывает статус фильма онлайн, но я не уверен, что я делаю, чтобы вставить это онлайн результаты отображаются первыми.

query

Film::select('films.*')
    ->when($filters->input('status'), function ($query, $status) {
            $query->where('status', $status);
    })
    ->orderBy('films.updated_at', 'desc')
    ->distinct()
    ->get();

test Это ниже не сработает, но это грубая идея.

    /**
     * @test
     */
    public function order_by_online_status()
    {
        $film = factory(Film::class)->create([
            'status' => FilmStatus::OFFLINE
        ]);

         $film2 = factory(Film::class)->create([
            'status' => FilmStatus::ONLINE
        ]);

        $response = $this->json('GET', '/films');

        $this->assertEquals(
            $film, $film2);
}

как бы я assertEquals, который онлайн указан первым.

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Я бы подтвердил ответ на запрос, и, поскольку это запрос, я бы также сделал утверждение кода состояния ответа. Я сделал бы это следующим образом:

<?php
public function test_index_default_order_by_online_status()
{
    $film1 = factory(Film::class)->create([
        'status' => FilmStatus::OFFLINE
    ]);

     $film2 = factory(Film::class)->create([
        'status' => FilmStatus::ONLINE
    ]);

    $this
        ->json('GET', '/films')
        ->assertOk()    // assert the response have status code 200
        ->assertJson([  // assert the order
            $film2,     // film2 goes first since you ordered by created_at desc
            $film1
        ]);
}

Вы должны помнить о json, который вы здесь утверждаете, так как вы могли бы вернуть результат в другом формате, используя преобразователь. Поэтому было бы лучше, если бы вы преобразовали результат в тот же формат, который вы использовали на контроллере до подтверждения. Например:

<?php

public function test_index_default_order_by_online_status()
{
    $film1 = factory(Film::class)->create([
        'status' => FilmStatus::OFFLINE
    ]);

     $film2 = factory(Film::class)->create([
        'status' => FilmStatus::ONLINE
    ]);

    // parse the result
    $result = $this->getExpectedResult([$film2, $film1]);

    $this
        ->json('GET', '/films')
        ->assertOk() // assert the response
        ->assertJson($result);
}

private function getExpectedResult($data) {
    return fractal($data, new FilmTransformer())->toArray();
}

Другая вещь, которую вы должны принять к сведению, - это атрибут updated_at, с которым вы сортируете. Хотя $film1 и $film2 создаются по порядку, однако из-за скорости выполнения теста updated_at может быть непоследовательным, что приведет к сбою теста. Поэтому я бы посоветовал отрегулировать время создания до вашего теста.

Я собираюсь использовать метод setTestNow() из Carbon, чтобы мы могли манипулировать временем во время теста.

<?php
public function test_index_default_order_by_online_status()
{
    // set $film1 creation time
    Carbon::setTestNow(Carbon::create(2019, 1, 1, 11, 0, 0));

    $film1 = factory(Film::class)->create([
        'status' => FilmStatus::OFFLINE
    ]);

    // set $film2 creation time
    Carbon::setTestNow(Carbon::create(2019, 1, 1, 11, 59, 59));

    $film2 = factory(Film::class)->create([
        'status' => FilmStatus::ONLINE
    ]);

    // reset the time
    Carbon::setTestNow();

    $result = $this->getExpectedResult([$film2, $film1]);

    $this
        ->json('GET', '/films')
        ->assertOk() // assert the response
        ->assertJson($result);
}

Тем самым вы можете убедиться, что атрибут updated_at будет другим.

Надеюсь, это поможет.

0 голосов
/ 25 февраля 2020

Вы можете попробовать с несколькими записями, если вы знаете ожидаемый результат, создать переменную json и сравнить ее с результатом.

    $jsonFilms = "[{
            "id": "0",
            "film": "name",
            "status": "Offline",
        },
        {
            "id": "1",
            "film": "name1",
            "status": "Offline",
        },
        {
            "id": "2",
            "film": "name2",
            "status": "Offline",
        }]";

$this->assergEquals($response, $jsonFilms);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...