Тестовый случай Laravel для проверки одного элемента в выводе JSON - PullRequest
0 голосов
/ 13 октября 2018

В моем приложении Laravel есть следующий контроллер:

class ProjectController extends Controller {
    ...
    public function index() {
        $projects = Project::where('is_completed', false)
            ->orderBy('created_at', 'desc')
            ->withCount(['tasks' => function ($query) {
                $query->where('is_completed', false);
            }])->get();
        return response()->json($projects);
    }
    ...
}

, на который ссылается следующий маршрут:

Route::get('projects', 'ProjectController@index');

Когда я перехожу на URL: http://localhost:8000/api/projects Я получаю:

[
    {
        "id": 2,
        "name": "Project 02 Title",
        "description": "Project 02 Description",
        "is_completed": 0,
        "created_at": "2018-10-13 16:23:28",
        "updated_at": "2018-10-13 16:23:28",
        "tasks_count": 0
    },
    {
        "id": 1,
        "name": "Project 01 Title",
        "description": "Project 01 Description",
        "is_completed": 0,
        "created_at": "2018-10-13 16:22:52",
        "updated_at": "2018-10-13 16:22:52",
        "tasks_count": 0
    }
]

Кроме того, у меня есть следующий тестовый файл:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProjectTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testExample()
    {
        $response = $this->get('/');
        // this is not working:
        // $response->assertJson([ 0 => [ 'name' => 'Project 02 Title' ] ]);
    }
}
?>

Что я хочу сделать на testExample(), это проверить, является ли name членпервый элемент в выходном массиве (в формате JSON) имеет строковое значение: Project 02 Title.

Есть идеи, как этого добиться?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

Вы можете использовать:

$json = $reponse->json();

$this->assertSame(['name' => 'Project 02 Title'], $json[0]);

или в случае, если вы хотите проверить точное значение json, которое вы можете использовать:

$response->assertExactJson([[
   'name' => 'Project 02 Title'
]]);

Конечно, вы также можете проверить отдельные атрибуты, например:

$json = $reponse->json();

$this->assertSame('Project 02 Title', $json[0]['name']);
0 голосов
/ 13 октября 2018

Проверьте свой тест еще раз, вы не посещаете правильную конечную точку:

$response = $this->get('/');

Это должно выглядеть примерно так:

$response = $this->get('/api/projects');

Ваш тест должен работать, он выглядит хорошо.

...