为什么 capybara/rspec 会丢失 current_user?

发布于 2024-09-24 18:46:07 字数 3831 浏览 0 评论 0原文

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

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

。在测试期间,会话变量仍然存在。我有一个标准的 Authlogic 设置,并且所有其他测试都通过了,所以我真的不知道出了什么问题,但是黄瓜/水豚测试(我正在迁移的地方)也失败了,所以我认为这是一个失败的规格

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

“rake spec”结果:

...................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

Gems:

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"

The following spec is failing and failing over again. I've tried everything but can't get it to work. If I test it manually all looks fine :( Some help/tips would be really nice!

The join action should add an logged-in user to a guild/group if he/she has the right token (in the URL). If the user isn't logged in, the action redirects to the login page and saves the token and the ID to cookies. After login the user gets redirected to the join page if the cookies are set.

I've found out that the current_user get lost during the test. The session variable is still present. I've a standard Authlogic setup and all other tests are passing so I really don't know what's going wrong. I'm new to RSpec/capybara but the cucumber/capybara test (from which I'm migrating) is also failing so I think it's a capybara issue.

Failing Spec:

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

Controller Action:

  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

"rake spec" result:

...................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

Gems:

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"

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深白境迁sunset 2024-10-01 18:46:07
# 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

# 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

This is from http://gist.github.com/470808

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文