Модульное тестирование Laravel нужна помощь, чтобы правильно передать мои переменные - PullRequest
0 голосов
/ 07 декабря 2018

Итак, я вхожу в модульное тестирование и создал тест для создания и настройки линии в моей БД.Вот код:

        $response = $this->json('POST', '/quotes/3/adjustment',
               [
                    'adjustments' => array([
                        'description'   => 'TEST-Description',
                        'amount'        => 1000,
                        'quote_id'      => 3
                    ])
                ]
    );
    $response->assertStatus(201);

При создании он попадает в мой контроллер, затем создается экземпляр моей модели уравнивания, и в этой модели у меня есть этот код для его создания:

            foreach($request->adjustments as $adjustment) {
            if(array_key_exists('id', $adjustment)) {
                $this->find($adjustment['id'])->update([
                    'description'   => $adjustment['description'],
                    'amount'        => $adjustment['amount'],
                    'quote_id'      => $quote->id
                ]);
            } else {
                $this->create([
                    'description'   => $adjustment['description'],
                    'amount'        => $adjustment['amount'],
                    'quote_id'      => $quote->id,
                ]);
            }
        }
        return $quote;

Таким образом, он ожидает, что корректировки будут массивом, и я подумал, что правильно закодировал его в тесте, но я получил ответ 200, что не соответствует ожидаемому 201.Любые идеи о том, как правильно передать один массив в моем тестовом файле, чтобы он прошел тест?

Вот мой контроллер:

        $adjustment = new Adjustment();
    return $adjustment->newAdjustment($quote, $request)->adjustments;

На заметку, если я запусту это вПочтальон в виде необработанного JSON (Applicatoin / JSON) создает ресурс в БД:

{
"adjustments": [{
        "description": "testing-postman",
        "amount": 1000,
        "quote_id": 1
}
    ]

}

1 Ответ

0 голосов
/ 07 декабря 2018

Начиная с Laravel 5.6, если вы возвращаете вновь созданную модель из вашего контроллера, Laravel автоматически установит статус ответа на 201.Обычно это то, что вы будете делать при создании API, соответствующего методам RESTful.

Однако это может не подходить для вашего случая, поскольку вам может потребоваться возвращать другие данные с вашего контроллера, а не только недавно созданную модель и, если это так,Я полагаю, что вместо этого Laravel вернет 200.

Таким образом, у вас есть несколько вариантов:

  • В вашем контроллере вы можете форсировать 201 с помощью return response($myData, 201);
  • Вернуть только вновь созданную модель и ничего больше.
  • Или просто сделайте ваш тест следующим:
    • $response->assertStatus(200);
    • $this->assertDatabaseHas('adjustments', $adjustment->toArray());

С третьим вариантом ваш тест проверяет, что все прошло нормально и что фактическая модель была создана и существует в базе данных ( вам нужно будет настроить ее в соответствии с вашимНужно ).

  • Дополнительная информация о Laravel 5.6 201 Ответ: https://laravel.com/docs/5.6/upgrade - Поиск на странице: Возвращение вновь созданных моделей
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...