按照Devise How-To page的说明,我正在尝试重建我的所有rspec测试以绕过用户登录过程。
有两种方法可用于此:
sign_in
- 不能用于功能测试(Capybara)login_as
(Devise建立在它之上)第一次射击的第一种方法(所有测试通行证)除了与Capybara的那些,所以我现在决定离开它。
2nd给了我一些奇怪的结果 - 除了第一个之外的所有传球(我作为文件中的第一个传球)。当我只运行其中一个时失败了。我已经使用binding.pry
进行了检查,但由于用户未登录并且重定向到登录页面而失败。不知何故,第一次测试触发了使所有其余部分通过的东西。我不知道这里发生了什么。
之前我使用过的是around
个问题,但它behaves really weird因此我将其更改为before
和after
的设置(同时它的工作速度更快它只在乞讨时创建一个用户而不是每次测试。这就是现在的样子:
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
我想请你帮忙。
答案 0 :(得分:1)
我会尝试将您的before(:all)
和after(:all)
代码移到before(:each)
和after(:each)
。 :all
与let
,DatabaseCleaner
无法合作,或者为第一次执行的测试提供可预测的执行顺序。