Модульному тестированию Laravel нужна помощь в том, как правильно передавать мои переменные

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

        $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
}
    ]

}

что вы возвращаете в своем контроллере?

adam 07.12.2018 16:29

Редактирование исходного сообщения для отображения

Brad Goldsmith 07.12.2018 16:32

Какую версию Laravel вы используете?

Denis Priebe 07.12.2018 16:42

Используется самая последняя версия, поэтому 5.7

Brad Goldsmith 07.12.2018 16:44

Где вы возвращаете статус 201?

apokryfos 07.12.2018 16:49

201s - это ожидаемый ответ при создании ресурса.

Brad Goldsmith 07.12.2018 16:55

Хорошо, теперь я просто заглянул в свою БД, поскольку они создаются в БД, он просто возвращается как 200 вместо 201. Так что это вроде работает, но не совсем. Это становится все более и более странным.

Brad Goldsmith 07.12.2018 16:56

adjustments - это ресурс?

adam 07.12.2018 16:57

Это действительно так. Я думаю, что это может иметь какое-то отношение к возврату настроек свойства цитаты (красноречивое отношение), но я не уверен на 100%. Я новичок в модульном тестировании и теперь понимаю, почему это так важно.

Brad Goldsmith 07.12.2018 16:59

Похоже, вы возвращаете JSON-представление созданной модели из вашего контроллера, это правильно?

RMcLeod 07.12.2018 17:01

Правильно, вот что я спрашивал, является ли свойство adjustments ресурсом?

adam 07.12.2018 17:01
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
11
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

Итак, у вас есть несколько вариантов:

  • В вашем контроллере вы можете заставить 201 с 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 идеален. Спасибо большое

Brad Goldsmith 07.12.2018 17:12

Круто, рад помочь.

Denis Priebe 07.12.2018 17:13

Другие вопросы по теме