Создание теста RSpec, учебник Hartl => RoR 3.1.CH10: вызов test_sign_in или post: create,: session => @attr из users_controller_spec - PullRequest
0 голосов
/ 14 декабря 2011

Я пытаюсь пройтись по учебному пособию Хартла по Ruby on Rails , в то время как обновляю его примеры до Rails 3.1, изучая railscasts и stackoverflow-посты, потому что мне нравится трудное обучение.Моя версия включает в себя has_secure_password.

К сожалению, я столкнулся с проблемой.Почему-то я не могу позвонить test_sign_in (@user) с users_controller_spec.rb.Я могу позволить тестам пройти путем обмана и использования post :create, :user => @attr, потому что этот метод также вызовет sign_in.Более того, я вполне уверен, что это в основном проблема, связанная с RSpec, так как все провальные тесты действительно работают при попытке сценария в браузере.

Тест, похоже, вызывает post :create, :session => @attr, но не проходитна самом деле войти. Я думал, что это может иметь какое-то отношение к моей фабрике;но я не думаю, что с этим что-то не так.После нескольких часов попыток я потерял надежду и обратился к вам, ребята.Было бы здорово, если бы вы могли помочь мне!

провал тестов в users_controller_spec.rb

describe "PUT 'update'" do

    before(:each) do
      @user = Factory(:user)
       @attr = { :email => @user.email, :password => @user.password }
       post :create, :session => @attr
      #sign_in(@user)
    end

    describe "failure" do

      before(:each) do
        @attr = { :email => "", :name => "", :password => "",
                  :password_confirmation => "" }
      end

      it "should render the 'edit' page" do
       put :update, :id => @user, :user => @attr
       response.should render_template('edit')
      end

session_controller.rb метод создания

class SessionsController < ApplicationController

  def create
      user = User.find_by_email(params[:session][:email]) 
      if user && user.authenticate(params[:session][:password])
        if params[:remember_me]  
          sign_in_permanent (user)
        else
          sign_in (user)
        end
          redirect_to user, :notice => "Logged in!"
      else
          flash.now[:error] = "Invalid email or password"
          @title = "Sign in"
          render 'new'
        end
    end

Примечание. Я понимаю, что здесь я не придерживаюсь DRY, к сожалению, пока не знаю, как передать параметры в метод sign_in: (

session_helper.rb sign_in метод

def sign_in(user)
    cookies[:remember_token] = user.remember_token
    current_user = user
    @current_user = user
end

Если я не ошибаюсь, это весь код, который связан с этой «ошибкой». Очевидно, я мог бы опубликовать гораздо больше кода, но, вероятно, не будупомогите чем-нибудь. Если это предположение неверно, пожалуйста, дайте мне знать, и я опубликую все необходимое.

1 Ответ

1 голос
/ 15 декабря 2011

Разобрался, как это сделать.Из-за различных контроллеров эти тесты необходимо преобразовать в интеграционные тесты.

См. Следующие ссылки для подробного обзора интеграционных испытаний:

http://relishapp.com/rspec/rspec-rails/docs/request-specs/request-spec http://api.rubyonrails.org/classes/ActionDispatch/IntegrationTest.html

...