我可以从控制器规格访问当前用户,没有问题。从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消息。
为此,我需要在创建邀请的操作中定义当前用户。
你的助手。有这个吗?
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
不要在特性规范中使用控制器帮助器——在BDD中,您希望特性规范通过浏览器DSL(如Capybara)完成所有工作。在您的情况下,最好编写一个单独的helper方法来使用Capybara登录(下面的示例)。
您希望您的特性规范是从用户的角度进行的。用户不关心控制器如何创建用户会话,您的特性规范也不应该关心。它应该位于规范类型的域内。
在您的情况下,更好的解决方案是编写另一个助手方法(特别是针对:feature
specs),该方法通过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 来表示示例代码的预期效果。 其他详细信息请看这里。