Тесты сейчас проходят.

м приложении Mojolicious мне нужно использовать IP-адрес клиента ($c->tx->remote_address) для ограничения скорости обслуживания. Это хорошо работает.

Сейчас я пытаюсь создать модульный тест для этой функции, но у меня возникают проблемы с подделкой IP-адреса клиента в моих тестах.

Сначала я подумал, чтоlocal_address в Моджо :: UserAgent может делать то, что я хочу, но именно там пользовательский агент связывает приложение локально, и изменение его нарушает все, потому что он больше не может найти приложение.

Затем я попытался с помощьюSub :: Override заменитьremote_address в Моджо :: Сделка, но это уже относится к клиенту, когда я делаю$t->post_okон пытается отправить запрос на IP-адрес, который не существует, потому что удаленный адрес на стороне клиента является адресом сервера, и я застрял с ожидающим блокирующим запросом, который никогда не будет успешным, потому что сервер, которого он хочет, не существует.

Вы можете использовать следующую MCVE, чтобы попробовать. Ожидаемый результат для прохождения тестов.

use strict;
use warnings;
use Test::More;
use Test::Mojo;
use Mojolicious::Lite;

get '/foo' => sub { my $c = shift; $c->render( text => $c->tx->remote_address ) };

my $t = Test::Mojo->new;
$t->get_ok('/foo')->content_like(qr/\Q127.0.0.1/);

# TODO change client IP address to 10.1.1.1
# in a way that the /foo route sees it
$t->get_ok('/foo')->content_like(qr/\Q10.1.1.1/);

done_testing;

Я знаю, как сделать это с Catalyst и Dancer (или другими системами на основе Test :: Plack), но эти подходы здесь не работают.

Ответы на вопрос(1)

Ваш ответ на вопрос