Rails 4 Rspec Capybara:提取通用测试功能到 Ruby 模块不工作

Rails 4 Rspec Capybara: Extracting common test functionality to Ruby module not working

我想从我的功能测试中提取 sign_in 到 Ruby 模块中,与此 Thoughtbot article 一致。功能未看到 sign_in。我做错了什么?

Failures:
  1) User signs in with valid email and password
     Failure/Error: sign_in
     NameError:
       undefined local variable or method `sign_in' for #<RSpec::ExampleGroups::UserSignsIn:0x0000000238a958>
     # ./spec/features/sign_in_spec.rb:16:in `block (2 levels) in <top (required)>'
     # .bundle/binstubs/rspec:16:in `load'
     # .bundle/binstubs/rspec:16:in `<main>'
Finished in 0.17549 seconds (files took 2.77 seconds to load)
1 example, 1 failure

spec/features/sign_in_spec.rb

require 'rails_helper'

feature 'User signs in' do
  scenario 'with valid email and password' do
    sign_in
    expect(page).to have_content 'Signed in successfully'
  end
end

spec/support/features/session_helpers.rb

module Features
  module SessionHelpers
    def sign_in
      user = create(:user)
      visit '/'
      find(:xpath, "//a[@href='/users/sign_in']").click
      fill_in 'Email', with: user.email
      fill_in 'Password', with: user.password
      click_button 'Sign in'
    end
  end
end

spec/support/features.rb

RSpec.configure do |config|
  config.include Features::SessionHelpers, type: :feature
end

rails_helper.rb

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)

abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'spec_helper'
require 'rspec/rails'
require 'pry'
require 'faker'
require 'devise'
require 'email_spec'

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
  config.include FactoryGirl::Syntax::Methods # Include Factory Girl syntax to simplify calls to factories
  config.use_transactional_fixtures = true
  config.include Devise::TestHelpers, type: :controller
  config.infer_spec_type_from_file_location!
  config.include(EmailSpec::Helpers)
  config.include(EmailSpec::Matchers)
end

spec_helper.rb

require 'codeclimate-test-reporter'
CodeClimate::TestReporter.start

require 'capybara/rspec'
require 'capybara/email/rspec'

RSpec.configure do |config|

  config.before(:each) { ActionMailer::Base.deliveries.clear } # uses email_spec gem to clear mail delivereies

  config.expect_with :rspec do |expectations|
    expectations.include_chain_clauses_in_custom_matcher_descriptions = true
  end

  config.mock_with :rspec do |mocks|
    mocks.verify_partial_doubles = true
  end
end

你的 rails_helper.rbspec_helper.rb 中有什么东西会导致你的助手被加载吗?

将您的 rails_helper.rb 改为:

ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)

abort("The Rails environment is running in production mode!") if Rails.env.production?

require 'spec_helper'
require 'rspec/rails'
require 'pry'
require 'faker'
require 'devise'
require 'email_spec'

Dir[Rails.root.join("spec/support/**/*.rb")].each { |f| require f }

ActiveRecord::Migration.maintain_test_schema!

RSpec.configure do |config|
    config.include Features::SessionHelpers, type: :feature
...

并删除spec/support/features.rb。这将确保执行顺序正确,创建您的助手模块(以及 support 文件夹中的任何其他内容),然后将助手包含在 RSpec 的命名空间中。