Итак, я вхожу в модульное тестирование и создал тест для создания и настройки строки в своей БД. Вот код:
$response = $this->json('POST', '/quotes/3/adjustment',
[
'adjustments' => array([
'description' => 'TEST-Description',
'amount' => 1000,
'quote_id' => 3
])
]
);
$response->assertStatus(201);
Когда он создается в моем контроллере, создается экземпляр моей модели Adjustment, и в этой модели у меня есть этот код для ее создания:
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 (application / json), он создает ресурс в БД:
{
"adjustments": [{
"description": "testing-postman",
"amount": 1000,
"quote_id": 1
}
]
}
Редактирование исходного сообщения для отображения
Какую версию Laravel вы используете?
Используется самая последняя версия, поэтому 5.7
Где вы возвращаете статус 201?
201s - это ожидаемый ответ при создании ресурса.
Хорошо, теперь я просто заглянул в свою БД, поскольку они создаются в БД, он просто возвращается как 200 вместо 201. Так что это вроде работает, но не совсем. Это становится все более и более странным.
adjustments - это ресурс?
Это действительно так. Я думаю, что это может иметь какое-то отношение к возврату настроек свойства цитаты (красноречивое отношение), но я не уверен на 100%. Я новичок в модульном тестировании и теперь понимаю, почему это так важно.
Похоже, вы возвращаете JSON-представление созданной модели из вашего контроллера, это правильно?
Правильно, вот что я спрашивал, является ли свойство adjustments ресурсом?

Начиная с Laravel 5.6, если вы вернете вновь созданная модель от вашего контроллера, Laravel автоматически установит статус ответа на 201. Обычно это то, что вы делаете при создании API, который следует практике RESTful.
Однако это может не соответствовать вашему случаю, так как вам может потребоваться вернуть другие данные с вашего контроллера, а не только вновь созданную модель, и если это так, я считаю, что Laravel вместо этого вернет 200.
Итак, у вас есть несколько вариантов:
return response($myData, 201);$response->assertStatus(200);$this->assertDatabaseHas('adjustments', $adjustment->toArray());С третьим вариантом ваш тест проверяет, что все прошло нормально и что фактическая модель была создана и существует в базе данных (вам нужно будет настроить его в соответствии с вашими потребностями).
201 Laravel 5.6: https://laravel.com/docs/5.6/upgrade - Найдите на странице: Возврат вновь созданных моделейЭто объяснение идеально. Я только что сделал (200) на данный момент, но ответ с 201 идеален. Спасибо большое
Круто, рад помочь.
что вы возвращаете в своем контроллере?