【发布时间】:2016-08-11 22:03:25
【问题描述】:
我可以从控制器规格访问 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 规范中不可用...这是有道理的,因为类型是“功能”而不是“控制器”。我假设这就是原因。
我认为我应该能够使用 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。
【问题讨论】:
-
为什么不创建自己的模块助手,例如
module FeatureHelper就像module ControllerMacros专门用于功能测试。 -
您引用的问题的已接受答案的第一部分是您正在寻找的答案。不要尝试在功能规范中检查
current_user;检查页面以查看谁已登录。 -
@DaveSchweisguth,我正在寻找的是下面 rmhunters 答案的第二部分。
标签: ruby-on-rails rspec devise capybara