Задать вопрос

Как правильно написать unit тест?

Здравтсвуйте! Разбираюсь с тестами. Получается что работаю я с Laravel фреймворком и AngularJS. Большинство моих методов возвращают JSON объекты.
Ну пример стандартного метода:
/**
     * Update company.
     *
     * @param int $id Company id
     * @param Request $request Company data
     * @throws ModelNotFoundException If company is not found
     * @return Response
     */
    public function update(int $id, Request $request): Response
    {
        try{
            $company = Company::findOrFail($id);
            $rules = array(
                'email' => 'required|email|unique:companies,email,' . $request->id. ',id',
                'name' => 'required',
                'address' => 'required',
            );

            $validator = Validator::make($request->all(), $rules);
            if ($validator->fails()) {
                $messages = $validator->messages();

                return response([
                    'error' => $messages
                ], 400);
            } else {
                $company->name = $request->name;
                $company->email = $request->email;
                $company->address = $request->address;
                $company->save();

                return response([
                    'success' => true, 'data' => $company
                ], 200);
            }
        }catch (ModelNotFoundException $e){
            return response([
                'error' => true
            ], 400);
        }
    }


В Laravel есть уже все необходимое для написания теста (на PhpUnit). Но здесь вот не могу никак понять как правильно написать тест.
На просторах инета вижу простые примеры тестов которые проверяют на true false (AssertTrue/AssertFalse) метод и т.п. Ну а что если у меня например возвращается Json и аргументы типизированные?
Может кто написать верный тест к такому методу?
Мне бы это очень помогло.
Спасибо!
  • Вопрос задан
  • 1692 просмотра
Подписаться 4 Оценить Комментировать
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
1) это не юнит тест, это интеграционный тест. Он проверят "часть системы в сборе", в вашем случае апишку. Если бы вы тестировали через UI (то есть через ангуляр) - это называлось бы end-to-end тест (от кнопок до базы данных мол).

2)
На просторах инета вижу простые примеры тестов которые проверяют на true false


Давайте думать. Вот как бы вы проверяли такое руками? Можете придумать? А теперь можете написать скрипт который проверяет это за вас? Вот вы и умеете писать интеграционные тесты, это не очень сложно. Нужно только не зацикливаться.

Что вам по сути важно когда вы пишите апишку? Скорее всего вы хотите всегда знать что структура ваших ответов не сломалась. Что вы случайно не поменяли имя поля, или случайно не убрали нужные поля. Для этого есть такая штука как json schema. То есть мы берем json и проверяем на соответствие. Опять же для phpunit можно найти готовые ассерты что бы не пилить велосипед.

Далее, что еще нам может хотеться проверить - статус коды. Это опять же легко и думаю в документации к laravel это есть. Так же возможно вы захотите проверять заголовки но это уже специфичные штуки.

Словом все что вы хотите проверить - вы просто проверяете. Правильно - это когда оно выполняет ваши потребности.

Ну и возможно вам захочется проверить данные в json ответе. Тут уже есть кучи вариантов. Я например запилил свой велосипед для частичного сравнения JSON-а (ну не интересно мне все проверять). Можно и другими решениями это делать, но лично я такие штуки на этом уровне проверяю крайне редко, ибо... ну у меня другие тесты за проверку логики отвечают.
Ответ написан
Denormalization
@Denormalization
Стоит иногда обращаться к документации https://laravel.com/docs/5.3/application-testing#t...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы