Rspec / Rails 4,从Rspec.feature规范访问current_user?

时间:2016-08-11 22:03:26

标签: ruby-on-rails rspec devise capybara

我可以从控制器规格访问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。

2 个答案:

答案 0 :(得分:3)

TL; DR

不要在功能规格中使用控制器助手 - 在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