2017-02-21 71 views
0

У меня есть user, который я создаю с помощью FactoryGirl, для которого необходимо войти в систему root_url.Devise Rspec ожидал, что ответ будет иметь код состояния успеха (2xx), но это было 302

Мне не повезло, что пользователь выполнил вход в систему. Я следил за this tutorial для части Devise пользователя и немного исправил ее, так как мой пользователь также должен связать с ним company.

Я теперь создал новую модель/контроллер под названием Scans, который находится за authenticate фильтром Разрабатывают и мой первый проход при тестировании его неисправного с:

5) ScansController GET #show returns http success 
    Failure/Error: expect(response).to have_http_status(:success) 
     expected the response to have a success status code (2xx) but it was 302 
    # ./spec/controllers/scans_controller_spec.rb:32:in `block (3 levels) in <top (required)>' 
    # ./spec/spec_helper.rb:127:in `block (3 levels) in <top (required)>' 
    # ./spec/spec_helper.rb:126:in `block (2 levels) in <top (required)>' 

спецификации в настоящее время:

require 'rails_helper' 

RSpec.describe ScansController, type: :controller do 

    before(:all) do 
    @user = build(:user) 
    @company = build(:company) 
    @device = build(:device) 
    @scan = build(:scan) 
    end 

    describe "GET #show" do 
    it "returns http success" do 
     login_with @user 
     get :show, :device_id => @device.id, :id => @scan.id 
     expect(response).to render_template(:show) 
    end 
    end 

Я делаю puts на ответе, потому что я хочу посмотреть, что возвращается:

ScansController 
    GET #show 
302 
{"X-Frame-Options"=>"SAMEORIGIN", "X-XSS-Protection"=>"1; mode=block", "X-Content-Type-Options"=>"nosniff", "Location"=>"http://test.host/login", "Content-Type"=>"text/html; charset=utf-8"} 
#<Rack::BodyProxy:0x007fb52a7407c0> 

Итак, я перенаправлены обратно на мою страницу входа в систему, которая говорит мне, что мой метод login_with в ControllerHelpers не работает правильно:

module ControllerHelpers 
    def login_with(user = double('user'), scope = :user) 
    current_user = "current_#{scope}".to_sym 
    if user.nil? 
     allow(request.env['warden']).to receive(:authenticate!).and_throw(:warden, {:scope => scope}) 
     allow(controller).to receive(current_user).and_return(nil) 
    else 
     allow(request.env['warden']).to receive(:authenticate!).and_return(user) 
     allow(controller).to receive(current_user).and_return(user) 
    end 
    end 
end 

Теперь моя функциональность Войти делает в настоящее время работает (тестирование вручную). Первый контроллер, который срабатывает после того, как ApplicationController является PagesController#home:

def home 
    if current_user && current_user.company 
    verify_subscription 
    .... 
    else 
    redirect_to new_company_path 
    end 
end 

Если verify_subscription терпит неудачу пользователь также отправляется new_company_path, так что, кажется, не связаны с этим вопросом.

Основываясь на моих элементарных возможностях rspec, могу ли я предположить, что я даже не приближаюсь к подражанию логину? Если нет, что я делаю неправильно?

+0

вы читали https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and -4- (и-RSpec) – zetetic

+0

также, где используется метод 'login_with'? – zetetic

+0

@zetetic обновил метод rspec для вас ... 'login_with' есть. – Godzilla74

ответ

0

После многих упражнений я, наконец, получил свои тесты. Я в конечном итоге создать компанию в моем пользователя Factory:

after(:build) do |user| 
    user.company = create(:company) 
end