使用rspec的login_as首次测试失败

时间:2014-05-22 13:57:06

标签: ruby-on-rails rspec devise

按照Devise How-To page的说明,我正在尝试重建我的所有rspec测试以绕过用户登录过程。

有两种方法可用于此:

    来自Devise的
  1. sign_in - 不能用于功能测试(Capybara)
  2. 来自Warden的
  3. login_as(Devise建立在它之上)
  4. 第一次射击的第一种方法(所有测试通行证)除了与Capybara的那些,所以我现在决定离开它。

    2nd给了我一些奇怪的结果 - 除了第一个之外的所有传球(我作为文件中的第一个传球)。当我只运行其中一个时失败了。我已经使用binding.pry进行了检查,但由于用户未登录并且重定向到登录页面而失败。不知何故,第一次测试触发了使所有其余部分通过的东西。我不知道这里发生了什么。

    之前我使用过的是around个问题,但它behaves really weird因此我将其更改为beforeafter的设置(同时它的工作速度更快它只在乞讨时创建一个用户而不是每次测试。这就是现在的样子:

    require 'spec_helper'
    
    describe AlbumsController do
    
      let(:album) { create(:album) }
    
      before(:all) do
        @user = create :user
      end
    
      before(:each) do
        login_and_switch_schema @user
      end
    
      after(:all) do
        destroy_users_schema @user
        destroy_user @user
      end
    
      describe "GET #new" do
        before { get :new }
        it { expect(response).to render_template :new }
      end
    
      describe "GET #edit" do
        before { get :edit, id: album }
        it { expect(response).to render_template :edit }
      end
    
      ...
    

    我已经定义了帮助者:

    Warden.test_mode!
    
    def login_and_switch_schema(user) 
     #@request.env["devise.mapping"] = Devise.mappings[:user]
     #sign_in :user, user
     login_as(user, scope: :user)
     Apartment::Database.switch(user.username) 
    end
    
    def destroy_users_schema(user)
      Apartment::Database.drop(user.username)
      Apartment::Database.reset
    end
    
    def destroy_user(user)
      User.destroy(user)
    end
    

    我想请你帮忙。

1 个答案:

答案 0 :(得分:1)

我会尝试将您的before(:all)after(:all)代码移到before(:each)after(:each):allletDatabaseCleaner无法合作,或者为第一次执行的测试提供可预测的执行顺序。