我可以从控制器规格访问current_user没问题。在Rspec.feature规范中,我无法使current_user可用。
我需要current_user的原因是,我正在测试发送邀请功能。我导航到发送邀请的页面,填写邀请[to_user]字段,然后单击“发送邀请”。我想确保页面上显示正确的Flash消息。但是,我在通过单击“发送邀请”触发的控制器操作中将sender_id设置为current_user id - 这是我需要定义current_user的位置。
我为控制器测试设置了support / controller_macros.rb,如下所示:
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
user = FactoryGirl.create(:user)
sign_in user
end
end
end
支持/ devise.rb
RSpec.configure do |config|
config.include Devise::Test::ControllerHelpers, :type => :controller
config.extend ControllerMacros, :type => :controller
end
login_user在Rspec.feature规范中不可用...这是有道理的,因为类型是'feature'而不是'controller'。我假设这就是原因。
我想我应该可以使用Rspec.feature规范调用sign_in。但这不起作用...... sign_in方法也不可用。这是我试图开始工作的规范:
require "rails_helper"
RSpec.feature "Carpool Invitations", :type => :feature do
let!(:carpool) { FactoryGirl.create(:carpool)}
let!(:user) { FactoryGirl.create(:user)}
scenario "User sends a new carpool invite" do
sign_in user
visit new_carpool_invite_path(carpool)
fill_in "invite[to_user]", :with => "matthewalexander108@gmail.com"
click_button "Send Invitation"
expect(page).to have_text("Invitation was successfully sent!")
end
end
有没有办法配置Rspec.feature规范,以便它可以查看和使用support / controller_macros.rb文件中的login_user方法定义?我看了看:
Why i can not get current_user while writing test case with Rspec and Capybara
但我无法得到我需要的东西。
更新:
我的问题不同,因为我正在运行集成测试,最终我正在测试页面的内容。我正在运行的集成测试涉及发送邀请,发送邀请操作创建邀请对象,在创建邀请的过程中,current_user.id被添加为正在创建的邀请对象的sender_id
。成功创建邀请后,同一页面将重新加载flash消息。
我正在测试Flash消息。
为了做到这一点,我需要在创建邀请的动作中定义current_user。
答案 0 :(得分:3)
不要在功能规格中使用控制器助手 - 在BDD中,您希望功能规格通过浏览器DSL(如Capybara)完成所有操作。在您的情况下,最好为Capybara写一个单独的帮助方法(例如下面的例子)。
您希望功能规范来自用户的角度。用户并不关心控制器如何创建用户会话,您的功能规范也不应该如此。它应该保持在规范类型的范围内。
在您的情况下,更好的解决方案是编写另一个帮助方法(专门用于UserHistory
规范),通过Capybara方法签署用户,以便您的整个功能测试从相同的流程/透视图进行。这是我在所有应用中使用的通用助手方法:
:feature
然后,您的规范看起来像这样:
# spec/support/feature_helpers.rb
module FeatureHelpers
def sign_in
@user = FactoryGirl.create(:user)
visit "/"
click_link "Sign In"
fill_in "user_email", with: @user.email
fill_in "user_password", with: @user.password
click_button "Sign in"
end
end
RSpec.configure do |config|
config.include FeatureHelpers, :type => :feature
end
答案 1 :(得分:0)
你的rails_helper.rb有这个吗?
Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }
仅用于测试在rails_helper.rb
require 'devise'
RSpec.configure do |config|
#...
config.include Devise::TestHelpers, type: :controller
#...
end