【问题标题】:Why is capybara/rspec losing the current_user?为什么 capybara/rspec 会丢失 current_user?
【发布时间】:2010-09-27 14:26:03
【问题描述】:

以下规范失败并再次失败。我已经尝试了一切,但无法让它工作。如果我手动测试一切看起来都很好:(一些帮助/提示会非常好!

如果他/她拥有正确的令牌(在 URL 中),加入操作应该将登录用户添加到公会/组。如果用户未登录,该操作将重定向到登录页面并将令牌和 ID 保存到 cookie。登录后,如果设置了 cookie,用户将被重定向到加入页面。

我发现 current_user 在测试过程中迷路了。会话变量仍然存在。我有一个标准的 Authlogic 设置,所有其他测试都通过了,所以我真的不知道出了什么问题。我是 RSpec/capybara 的新手,但 cucumber/capybara 测试(我要从中迁移)也失败了,所以我认为这是水豚的问题。

失败的规格:

describe GuildsController do
  fixtures :roles

  def login
    @user = Factory(:User)
    visit login_path
    fill_in 'Login', :with => @user.login
    fill_in 'Password', :with => 'password'
    click 'Login'
    page.should have_css(".notice")
  end

  def assing_user_to_guild_as(role)
    role_id = Role.where(:name => role).first.id
    @guild.assignments << Assignment.new(:role_id => role_id, :user_id => @user.id, :guild_id => @guild.id)
  end

  before(:each) do
    @guild = Guild.first || Factory(:Guild).build 
    visit root_path 
  end

  context "a user" do
    before(:each) do
      login
    end

    it "should be able to join a guild with a valid token" do
      visit "guilds/#{@guild.id}/join/#{@guild.token}"
      @guild.members.include?(@user.login).should be_true
      page.should have_css(".notice")
    end

    it "shouldn't be able to join a guild with a invalid token" do
      visit "guilds/#{@guild.id}/join/#{@guild.token+"invalid"}"
      @guild.members.include?(@user.login).should be_false
      page.should have_css(".error")
    end
  end
end

控制器动作:

  def join
    @guild = Guild.find(params[:id])
    respond_to do |format|
      if current_user.nil?
        flash[:error] = t("have_to_be_logged_in")
        unless params[:token].nil?
          cookies[:rguilds_jg_token] = params[:token]
          cookies[:rguilds_jg_gid] = params[:id]
        end
        format.html { redirect_to(login_path) }
      else
        unless cookies[:rguilds_jg_token].nil? &&  cookies[:rguilds_jg_gid].nil?
          cookies.delete(:rguilds_jg_token)
          cookies.delete(:rguilds_jg_gid)
        end
        if @guild.verified?
          if params[:token] == @guild.token
            unless @guild.users.include?(current_user)
              @guild.assignments << Assignment.create(:user_id => current_user.id, :role_id => Role.find_by_name("member").id)
              flash[:notice] = t('guilds.joined')
              format.html { redirect_to(@guild) }
            else
              flash[:error] = t('guilds.already_joined')
              format.html { redirect_to(@guild) }
            end
          else
            flash[:error] = t('guilds.invalid_token')
            format.html { redirect_to(@guild) }
          end
        else
          flash[:error] = t('guilds.not_verified')
          format.html { redirect_to(@guild) }
        end
      end
    end
  end

“耙规格”结果:

...................FF.....................................................................

Failures:
  1) GuildsController a user should be able to join a guild with a valid token
     Failure/Error: @guild.members.include?(@user.login).should be_true
     expected false to be true
     # ./spec/integration/guilds_spec.rb:72:in `block (3 levels) in <top (required)>'

  2) GuildsController a user shouldn't be able to join a guild with a invalid token
     Failure/Error: page.should have_css(".error")
     expected #has_css?(".error") to return true, got false
     # ./spec/integration/guilds_spec.rb:79:in `block (3 levels) in <top (required)>'

Finished in 7.87 seconds
90 examples, 2 failures

宝石:

gem 'rails', '3.0.0.rc'
gem "mocha"
gem "rspec-rails", ">= 2.0.0.beta.19"
gem "factory_girl_rails"
gem 'capybara'
gem "authlogic", :git => "http://github.com/odorcicd/authlogic.git", :branch => "rails3"

【问题讨论】:

    标签: ruby-on-rails-3 rspec2


    【解决方案1】:
    # In your test_helper.rb / spec_helper.rb
    
    class ActiveRecord::Base
      mattr_accessor :shared_connection
      @@shared_connection = nil
    
      def self.connection
        @@shared_connection || retrieve_connection
      end
    end
    
    # Forces all threads to share the same connection. This works on
    # Capybara because it starts the web server in a thread.
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
    

    这是来自http://gist.github.com/470808

    【讨论】:

    • 我试过但没有用。作为Instance,使用capybara方法登录后,controllers中current_user为nil,RedDragon你还记得你是怎么解决的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多