Я обновляю устаревший проект до rails 5, и среди тестов rspec, которые терпят неудачу, у меня есть один, который говорит:
Failure/Error: expect(response).to be_redirect
expected `#<ActionDispatch::TestResponse:0x00007fbe5fde51f0 @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::...ch::Http::Headers:0x00007fbe5fdde9e0 @req=#<ActionController::TestRequest:0x00007fbe5fde5358 ...>>>>.redirect?` to return true, got false
# ./spec/controllers/search_controller_spec.rb:86:in `block (3 levels) in <top (required)>'
Я использую devise gem для аутентификации клиентов.
Тестыследующим образом:
describe SearchController do
before(:each) do
@client = FactoryGirl.create(:client)
end
describe "authenticated search" do
# a bunch of tests
end
describe "unauthenticated search" do
it "requires a user to be authenticated" do
get :search, params: { q: "tec" }, format: :json
expect(response).to be_redirect # FAILING HERE
end
end
end
Если я запускаю тест вручную и перехожу на /search?q=tec
, меня перенаправляют на страницу входа в систему.У search_controller.rb
есть before_action :authenticate_client!
Я пытался добавить sign_out @client
перед поиском, но это не сработало.Также пытался current_client.reload
, но не распознавал current_client.
В проверенных тестах поиска происходит вызов stub_authenticate_client
, который имеет следующий код:
def stub_authenticate_client(client)
allow(request.env['warden']).to receive(:authenticate!) { client }
allow(controller).to receive(:current_client) { client }
end
в случае, если этополезно для решения этой проблемы.
Я также пытался создать stub_logout_client
метод, подобный этому:
def stub_logout_client(client)
allow(request.env['warden']).to receive(:authenticate!) { nil }
allow(controller).to receive(:current_client) { nil }
end
и вызывать его в начале теста, но он все еще проходит before_action authenticate_client!
Также попробовал то, что было предложено здесь , но не работало
Контроллер поиска, который тестируется:
class SearchController < ClientApplicationController
before_action :authenticate_client!
def search
limit = params[:limit] ? params[:limit].to_i : 10
query = params[:q].to_s.downcase.strip
results = {}
if params[:report]
results[:this_report] = Report.where("SOME QUERY")
end
render json: results
end
end
Спасибо!