使用rspec的login_as首次测试失败
按照Devise How-To页面的说明,我正在尝试重建我的所有rspec测试以绕过用户登录过程。
有两种方法可用于此:
- 来自Devise的
sign_in
– 不能用于function测试(Capybara) - 来自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
对于let
, DatabaseCleaner
或者为第一次执行的测试提供可预测的执行顺序, :all
都不能很好地发挥作用。