Тестирование запроса JSON PUT в mojolicious

Я создаю тестовые примеры для своего приложения, разработанного с использованием фреймворка Mojolicious. Я проверяю маршруты для соответствующих ответов на сделанные вызовы REST. Я использую JSON как средство связи между сервером и клиентом. Для проверки запросов GET, POST и DELETE я использую следующие функции

GET : get_ok()
POST: post_json_ok()
DELETE: delete_ok()

но для PUT я не могу использовать put_ok(). И пример моего использования put_ok() будет следующим:

my $t = Test::Mojo->new;
$t->put_ok('this/is/url/to/resource'=>{ "element" => "modified value"})->status_is(204)

Я каждый раз получаю неверный статус запроса (400), поэтому тест не проходит. Я использую Test::Mojo для тестирования своего приложения.

Дополнительная информация:

$t->put_ok('http://localhost:3000/application/instances/system/test'=>{"model" => "testing put"})->status_is(204);

Это точный тест для PUT запроса, который был предпринят.
model — это свойство ресурса test, которое пытались изменить на testing put, а ожидаемый ответ статуса — 204.

Сопоставление с контроллером выполняется $r->route('/application/instances/system/:id, id => qr/[A-Za-z0-9 ]+/ -> via('put') ->to(controller => 'system', action => 'update_sys');
Этот маршрут вызывает метод update_sys в контроллере system, и именно так находится ресурс.


person Ha Sh    schedule 11.12.2012    source источник
comment
Я не вижу там put_ok, я вижу get_ok.   -  person Bill Ruppert    schedule 12.12.2012
comment
@Bill Ruppert ‹br› эта ссылка содержит объяснение put_ok   -  person Ha Sh    schedule 12.12.2012


Ответы (2)


На самом деле, после обсуждения с SRI в IRC, он указал мне на пример, почти идентичный вашим потребностям в документации< /а>.

# Test custom transaction
my $tx = $t->ua->build_json_tx('/user/99' => {name => 'sri'});
$tx->req->method('PUT');
$t->tx($t->ua->start($tx))
  ->status_is(200)
  ->json_is('/message' => 'User has been replaced.');

Так что это должно работать для вас!

Постскриптум:

Возможно, вам будет интересно узнать, что это обсуждение принесло некоторый прогресс: следующий выпуск Mojolicious (версия 3.66) теперь будет иметь более чистый синтаксис для этой цели, новый request_ok. Затем приведенный выше пример можно переписать как

my $tx = $t->ua->build_json_tx('/user/99' => {name => 'sri'});
$tx->req->method('PUT');
$t->request_ok($tx)
  ->status_is(200)
  ->json_is('/message' => 'User has been replaced.');
person Joel Berger    schedule 13.12.2012
comment
Спасибо @Joel, это именно то, что я искал. С нетерпением ждем метода request_ok. Очень признателен! - person Ha Sh; 14.12.2012
comment
Выпущена версия 3.66! request_ok сколько душе угодно! - person Joel Berger; 14.12.2012
comment
За этот ответ недавно проголосовали, поэтому я подумал, что прокомментирую. Все методы тестирования типа запроса теперь могут использовать генераторы контента, поэтому 'Эм! - person Joel Berger; 30.01.2015

Можете ли вы поделиться определением вашего маршрута для «this/is/url/to/resource»? сервер возвращает 400, поэтому кажется, что Mojo::Controller в вашем приложении не понимает, что вы отправляете...

person Paul Allen    schedule 12.12.2012
comment
Я могу заверить вас, что мой контроллер понимает, что я отправляю. Без этого теста, если я использую REST-клиент для изменения любого ресурса с помощью PUT, я могу это сделать и не получаю ответа 400. Только когда я использую модуль TEST::Mojo для проверки запроса PUT, я получаю сообщение об ошибке. Не могли бы вы уточнить определение маршрутов? Вы имеете в виду, как код того, как маршруты сопоставляются с контроллером, или вам нужен сам маршрут. Как бы то ни было, я уверен, что маршруты определены правильно. - person Ha Sh; 13.12.2012
comment
Я хотел, чтобы вы показали нам метод, с которым этот маршрут был сопоставлен в контроллере. при обращении за помощью ОП обычно полезно показать код, соответствующий данной проблеме. Так как ваш вызов предполагаемого put_ok выглядел нормально, тем, кто должен оказать помощь, обычно нужна дополнительная информация. Принятие этих вещей на веру и заверения обычно приводит к пустой трате времени, ИМХО. - person Paul Allen; 13.12.2012
comment
Спасибо @Paul, я добавил дополнительную информацию после вашего предложения. - person Ha Sh; 14.12.2012