当前位置: 首页 > 知识库问答 >
问题:

Rspec/Rails 4,从Rspec访问当前用户。功能规格?

崔博延
2023-03-14

我可以从控制器规格访问当前用户,没有问题。从Rspec内部。功能规范,我无法使当前用户可用。

我需要当前用户的原因是,我正在测试发送邀请功能。我导航到发送邀请的页面,填写邀请[to_user]字段,然后单击“发送邀请”。我想确保页面上显示正确的flash消息。但是,我正在通过单击“发送邀请”触发的控制器操作中将发送者\u id设置为当前\u用户id,我需要在此处定义当前\u用户。

我设置了支持/控制器\u宏。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

支持/设计。铷

RSpec.configure do |config|
  config.include Devise::Test::ControllerHelpers, :type => :controller
    config.extend ControllerMacros, :type => :controller
end

登录用户在Rspec内不可用。功能规格。。。这是有道理的,因为类型是“功能”而不是“控制器”。我想这就是原因。

我想我应该可以用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。功能规格,以便它可以查看和使用support/controller\u宏中定义的登录用户方法。rb文件?我看过:

为什么在使用Rspec和Capybara编写测试用例时无法获取当前用户

但是我没能得到我需要的。

更新:

我的问题是不同的,因为我正在运行一个集成测试,最终我在测试页面的内容。我正在运行的集成测试涉及发送一个invite,发送invite操作在创建invite的过程中创建一个invite对象,即当前用户。id被添加为正在创建的invite对象的发送者\u id。成功创建邀请后,同一页面将重新加载一条flash消息。

我正在测试flash消息。

为此,我需要在创建邀请的操作中定义当前用户。

共有2个答案

阳兴朝
2023-03-14

你的助手。有这个吗?

Dir[Rails.root.join('spec/support/***.rb')。每个{f|需要f}

仅用于测试,请在rails\u助手中添加此配置。rb

require 'devise'

RSpec.configure do |config|
  #...
  config.include Devise::TestHelpers, type: :controller
  #... 
end
鄢朝斑
2023-03-14

不要在特性规范中使用控制器帮助器——在BDD中,您希望特性规范通过浏览器DSL(如Capybara)完成所有工作。在您的情况下,最好编写一个单独的helper方法来使用Capybara登录(下面的示例)。

您希望您的特性规范是从用户的角度进行的。用户不关心控制器如何创建用户会话,您的特性规范也不应该关心。它应该位于规范类型的域内。

在您的情况下,更好的解决方案是编写另一个助手方法(特别是针对:featurespecs),该方法通过Capybara方法将用户登录,以便从相同的流/角度进行整个特性测试。以下是我在所有应用程序中使用的通用帮助器方法:

# 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

然后,您的规范将如下所示:

require "rails_helper"

RSpec.feature "Carpool Invitations", :type => :feature do
  let!(:carpool) { FactoryGirl.create(:carpool)}
  # you could still create a user here if you wanted

  scenario "User sends a new carpool invite" do
    sign_in
    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
 类似资料:
  • 在Deave文档中,他们给出了测试控制器时如何访问当前用户的提示: https://github.com/plataformatec/devise/wiki/How-To:-测试控制器-带导轨-3-和-4-(和RSpec) 但是,在进行特性测试时会发生什么情况?我正在尝试测试我的一个控制器的create方法,在该控制器中使用了current_用户变量。 问题是Deviate中建议的宏使用@requ

  • 这个问题告诉我如何从RSpec模型和控制器规范测试记录器语句。不幸的是,它似乎不适用于功能规范。使用以下代码: 我得到一个错误: 文件不包含,因此在控制器操作有机会完成之前,测试似乎立即失败。 有没有办法在功能规范中使用这种语法?

  • 我正在使用Rspec(2.13.0)请求规范测试移动站点的登录api。我有一个login_user方法,可以正确地将用户写入测试数据库,并在db中生成auth_令牌。 我不认为在“只是测试移动-登录-页面”的例子中,auth_token被正确地设置为会话值。我可以看到重定向发生在登录后,正确的auth_token是在重定向时发送(参见login_user方法中的注释)。 我的语法是否不正确(这是我

  • rspec-core 是 RSpec 运行和格式化工具。rspec-core 提供一个框架,用来书写你的代码应该怎样表现的可执行案例;以及一个 rspec 命令工具来限制哪些案例可以运行,调整输出格式。

  • rspec-mocks 是一个 rspec 的 test-double 框架,支持 method stubs, fakes 和生成 test-doubls 和类似真的对象的预期消息。

  • rspec-expectations 提供一个简单,合理的 API 来表示示例代码的预期效果。 其他详细信息请看这里。