I recently had to write some tests against a controller that was filtering based on the requesting format. In this case, I wanted to allow xml requests only, and redirect to login on everything else. This was fine when browsing or using curl by doing a simple:
skip_before_filter :login_required, :only => [:create], :if => Proc.new {|c| c.request.format.xml?}
My problem came when I was trying to create tests to verify that both html and xml requests did in fact produce the correct response. After many hours of messing around, I came up with a simple solution. First I skip the filters for every request, then I have another filter to re-enable them on anything but the xml request:
skip_before_filter :login_required, :only => [:create] before_filter :only => [:create] do |c| c.send(:login_required) unless c.request.format.xml? end
Voila!!! This allowed me to continue with my rails testing and browser and curl work appropriately. (I use curl to test the xml request).
def test_not_logged_in_normal_post post :create, :login => "test@test.com", :password => "test" assert_response :redirect end def test_not_logged_in_xml_post post :create, :format => "xml", :login => "test@test.com", :password => "test" assert_response :success end