2017-10-26 103 views
11

Benim Mojolicious uygulamasında, bir servisin hız sınırlaması için müşterinin IP adresini ($c->tx->remote_address) kullanmam gerekir. Bu iyi çalışıyor.İstemci IP adresini bir Mojolicious uygulaması için bir birim testinde nasıl taklit ederim?

Şimdi bu özellik için bir birim sınaması oluşturmaya çalışıyorum, ancak istemcimin IP'sini sınamalarımda hata yapmakta sorun yaşıyorum.

İlk olarak, local_address in Mojo::UserAgent'un istediğimi yapabileceğini düşündüm, ancak kullanıcı aracısının uygulamayı yerel olarak bağladığı ve onu değiştirmenin, uygulamayı artık bulamadığı için her şeyi bozduğu yer burası.

Sonra remote_address in Mojo::Transaction yerine Sub::Override kullanarak çalıştım ama $t->post_ok yaptığınızda zaten istemci için geçerlidir, bu istemci tarafında uzak adres sunucunun çünkü var olmayan IP için bir istek göndererek çalışır adresi ve istediği sunucu mevcut olmadığından asla başarılı olamayacak bekleyen engelleme isteğiyle sıkışmış durumdayım.

Denemek için aşağıdaki MCVE'ı kullanabilirsiniz. Beklenen sonuç testlerin geçmesidir.

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; 

Ben Katalizör ve Dancer (ya da diğer Testi :: Plack tabanlı sistemler) ile bunun nasıl biliyorum ama bu yaklaşımlar burada çalışmaz.

cevap

10

Mojolicious'in yazarı, X-Forwarded-For başlık uygulaması, so I did için Mojo dist biriminde birim testlerine bakmak için IRC'ye işaret etti.

$ENV{MOJO_REVERSE_PROXY}, birim sınamasında gerçek bir değere ayarlanmalı ve sunucuyu yeniden başlatmalı, ardından yeni IP adresiyle bir X-Forwarded-For üstbilgisi göndermeli ve bazı şeyler çalışacaktır.

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/); 

{ 
    local $ENV{MOJO_REVERSE_PROXY} = 1; 
    $t->ua->server->restart; 
    $t->get_ok('/foo' => { 'X-Forwarded-For' => '10.1.1.1' })->content_like(qr/\Q10.1.1.1/); 
} 

done_testing; 

Testler şimdi geçer.

ok 1 - GET /foo 
ok 2 - content is similar 
ok 3 - GET /foo 
ok 4 - content is similar 
1..4