2010-01-19 21 views

risposta

31

È possibile eseguire questa operazione facilmente senza eseguire lo stub, modificando la variabile di ambiente REMOTE_ADDR prima della chiamata del controller. Ecco un controller immaginario che reindirizza l'utente al percorso casa se il loro indirizzo IP è 1.2.3.4:

def index 
    if request.remote_ip == '1.2.3.4' 
    redirect_to root_path 
    return 
    end 

    @articles = Article.all 
end 

Ecco come è possibile verificare che funziona:

def test_should_reject_ip_1_2_3_4 
    @request.env['REMOTE_ADDR'] = '1.2.3.4' 
    get :index 
    assert_redirected_to root_path 
end 

Si imposta il telecomando prima della chiamata al controller, quindi sei in grado di simulare quei dati senza plugin o gemme speciali. Ed ecco la versione shoulda, per ItemsController:

context "with ip 1.2.3.4" do 
    setup do 
    @request.env['REMOTE_ADDR'] = '1.2.3.4' 
    get :index 
    end 

    should_not_assign_to :items 
    should_redirect_to("home"){home_path} 
    should_not_set_the_flash 
end 
1

Il controller di ricezione necessita di un metodo per rilevare l'indirizzo IP (o di riceverlo come parametro) e serve un modo per iniettare un indirizzo IP specifico per il test, o semplicemente specificare l'indirizzo IP di test come parametro per il metodo.

Se ciò non è facile considerando qualsiasi cosa l'app, ciò che si potrebbe fare è rendere la "funzionalità personalizzata" applicabile a un altro computer sulla rete domestica, se ne hai uno, e testare l'app in questo modo. Questo però non risolve la risposta "risolvilo attraverso un test unitario".

Posso chiedere perché l'app eseguirà un'azione specifica a seconda dell'indirizzo IP? Forse c'è un altro modo.

+0

Perché il rilevamento IP: l'applicazione mostra diversi elementi dell'interfaccia utente a seconda se l'utente in all'interno o al di fuori del nostro rete locale. – Ethan

1

Si dovrebbe essere in grado di farlo estinguendo le richieste e restituendo un oggetto fittizio che ha request.remote_ip uguale all'indirizzo IP desiderato.

Mi piacerebbe dare un'occhiata a FakeWeb per aiuto su questo. Ti consente di impostare facilmente le richieste/risposte previste. Potrebbe anche essere istruttivo guardare come Rails stesso does these kinds of tests.

0

Utilizzando gioiello "moka" Si può fare:

test "should something" do 
    request.expects(:remote_ip).returns("189.81.139.183") 
    ... 
end 
Problemi correlati