私のMojoliciousアプリでは、サービスのレート制限にクライアントのIPアドレス($c->tx->remote_address
)を使用する必要があります。これはうまくいく。MojoliciousアプリケーションのユニットテストでクライアントのIPアドレスを偽装するにはどうすればよいですか?
私は現在、この機能の単体テストを構築しようとしていますが、私のテストではクライアントのIPを偽装することに問題があります。
まずはlocal_address
in Mojo::UserAgentが私の望んだことをするかもしれないと思ったのですが、それはユーザーエージェントがアプリケーションをローカルにバインドしていて、アプリケーションをそれ以上見つけることができないため、
私はその後、remote_address
in Mojo::Transactionを交換するSub::Overrideを使用してみましたが、私は$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 and Dancer(または他のTest :: Plackベースのシステム)でこれを行う方法を知っていますが、ここではそれらのアプローチは機能しません。