アプリの一部の機能は、クライアントの IP アドレスによって動作が異なります。Railsの機能テストでそれをテストする方法はありますか? Test::Unit と Shoulda を使用しています。
4 に答える
これは、コントローラー呼び出しの前に REMOTE_ADDR 環境変数を変更することで、スタブなしで簡単に行うことができます。以下は、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
これが機能することをテストする方法は次のとおりです。
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
コントローラー呼び出しの前にリモート IP を設定しているため、特別なプラグインや gem を使用せずにそのデータを偽造できます。そして、ItemsController の shoulda バージョンは次のとおりです。
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
受信コントローラーには、IP アドレスを検出する (またはパラメーターとして受け取る) メソッドが必要であり、テスト用に特定の IP アドレスを挿入する方法、またはテスト IP アドレスをパラメーターとしてメソッドに指定する方法が必要です。
アプリの機能を考えると簡単ではない場合は、「カスタム機能」をホーム ネットワーク上の別のコンピューター (ある場合) に適用し、その方法でアプリをテストすることができます。ただし、「単体テストで解決する」という答えは実際には解決しません。
アプリが IP アドレスに応じて特定のアクションを実行する理由をお尋ねしてもよろしいですか? おそらく別の方法があります。
request.remote_ip
リクエストをスタブ化し、目的の IP アドレスと等しいモック オブジェクトを返すことで、これを達成できるはずです。
これについては、FakeWebを参照してください。予想されるリクエスト/レスポンスを簡単に設定できます。また、Rails 自体がこれらの種類のテストをどのように行っているかを確認することも有益です。
宝石「モカ」を使用すると、次のことができます。
test "should something" do
request.expects(:remote_ip).returns("189.81.139.183")
...
end