railstutorial.org - сбой rspec, но в браузере все в порядке - PullRequest
3 голосов
/ 20 июля 2011

Я пытаюсь следовать Rails Tutorial , и у меня произошел сбой rspec, но в браузере приложение работает по мере необходимости.Вот когда я вошел в (в браузере) и захожу на "http://localhost:3000/users/1/edit", эта страница открывается. Все предыдущие rspecs из учебника пропущены.

Я использую Rails '3.1.0.rc4' и работаюв Windows.

Спецификация, которая не работает (из users_controller_spec.rb):

describe "GET 'edit" do
    before(:each) do
      @user = Factory(:user)
      test_sign_in(@user)
    end

    it "should be successful" do
      get :edit, :id => @user
      response.should be_success
    end
end

код test_sign_in из spec_helper.rb:

RSpec.configure do |config|  
  config.mock_with :rspec

  config.fixture_path = "#{::Rails.root}/spec/fixtures"

  config.use_transactional_fixtures = true

  def test_sign_in(user)
    controller.sign_in(user)
  end
end

код фабрик.rb

Factory.define :user do |user|
  user.name "Mikhail"
  user.email "mikleb@yandex.ru"
  user.password "123456789a"
  user.password_confirmation "123456789a"
end

текст из консоли:

Failures:

  1) UsersController GET 'edit should be successful
     Failure/Error: response.should be_success
       expected success? to return true, got false
     # ./spec/controllers/users_controller_spec.rb:111:in `block (3 levels) in <
top (required)>'

UPD: после "get: edit,: id => @user" пользователь не вошел в систему. Но, как я писал в браузеревсе работает как нужно. Как это возможно?

вот SessionHelper, который включен в ApplicationControlelr:

module SessionsHelper
  def sign_in(user)
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
    self.current_user = user
  end

  def sign_out
    cookies.delete(:remember_token)
    self.current_user = nil
  end

  def signed_in?
    !current_user.nil?
  end

  def current_user=(user)
    @curent_user = user
  end

  def current_user
    @current_user ||= user_from_remember_token
  end

  def deny_access
    redirect_to signin_path, :notice => "Please sign in to access this page."
  end

  private
    def user_from_remember_token
      User.authenticate_with_salt(*remember_token)
    end

    def remember_token
      cookies.signed[:remember_token] || [nil, nil]
    end
end

1 Ответ

2 голосов
/ 21 июля 2011

Вы сбросили response.body, чтобы посмотреть, что думает Rspec? Вы можете (я забыл, если это все еще необходимо) включить render_views, как описано в этом вопросе ).

Возможно ли, что пользователь на самом деле не вошел в систему, и, следовательно, сайт перенаправляет с правки на страницу входа или что-то подобное?

Еще одно предостережение: я уверен, что rspec возвращает true только для be_success, если HTTP-код - это код 2xx (200 ok, 201 создан и т. Д.). Поэтому, если ваш контроллер перенаправляет (302, 304 и т. Д.), Тогда rspec не будет считать запрос «успешным».

Попробуйте добавить puts response.body перед утверждением, это может помочь вам сузить проблему.

...