使用rspec的login_as首次测试失败

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

有两种方法可用于此:

  1. 来自Devise的sign_in – 不能用于function测试(Capybara)
  2. 来自Warden的login_as (Devise是建立在它之上)

第一次射击的第一种方法(所有测试通行证)除了与Capybara的那些,所以我决定暂时离开它。

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

我之前使用的around钩子,但它的行为非常奇怪所以我把它改为before设置(同时它的工作速度要快得多,因为它只在乞讨时创建一个用户而不是每次测试)。 这就是现在的样子:

 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 

我想请你帮忙。

我会尝试将您的before(:all)after(:all)代码移动到before(:each)after(:each):all对于letDatabaseCleaner或者为第一次执行的测试提供可预测的执行顺序, :all都不能很好地发挥作用。