2010-01-19 14 views

Antwort

31

Sie können dies einfach und ohne Anstoßen, durch die REMOTE_ADDR Umgebungsvariable vor dem Controller Aufruf zu ändern. Hier ist ein fiktiver-Controller, der den Benutzer auf das Home-Pfad umleitet, wenn ihre IP-Adresse 1.2.3.4:

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

    @articles = Article.all 
end 

Hier ist, wie Sie testen können, dass es funktioniert:

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 

Sie die Einstellung der Fernbedienung ip im Vorfeld des Controller-Aufrufs, damit Sie diese Daten ohne spezielle Plugins oder Edelsteine ​​fälschen können. Und hier ist die shoulda Version, für 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

Der empfangende Controller benötigt eine Methode zum Erkennen der IP-Adresse (oder zum Empfangen als Parameter), und Sie müssen eine bestimmte IP-Adresse für Ihren Test eingeben oder einfach die Test-IP-Adresse als Parameter angeben die Methode.

Wenn das nicht einfach ist, was auch immer Ihre App tut, können Sie die "benutzerdefinierte Funktionalität" auf einen anderen Computer in Ihrem Heimnetzwerk anwenden und die App auf diese Weise testen. Das löst nicht wirklich die Antwort "Löse es durch einen Einheitentest".

Darf ich fragen, warum Ihre Anwendung eine bestimmte Aktion in Abhängigkeit von der IP-Adresse durchführen würde? Vielleicht gibt es einen anderen Weg.

+0

Warum Erkennung IP: die App verschiedene UI-Elemente zeigt je nachdem, ob Benutzer in innerhalb oder außerhalb unserer lokales Netzwerk. – Ethan

1

Sie sollten dies erreichen, indem Sie die Anfragen stubblen und ein Mock-Objekt zurückgeben, das request.remote_ip gleich der gewünschten IP-Adresse hat.

ich FakeWeb um Hilfe zu diesem Thema aussehen würde. Damit können Sie die erwarteten Anfragen/Antworten einfach einrichten. Es könnte auch lehrreich sein, sich anzusehen, wie Schienen selbst does these kinds of tests.

0

Mit Juwel „Mokka“ Sie tun können:

test "should something" do 
    request.expects(:remote_ip).returns("189.81.139.183") 
    ... 
end 
Verwandte Themen