RSpec 集成
添加
gem 'rspec-rails' 到Gemfile后执行bundle install`执行
rails g rspec:install生成rspec配置-
添加
Devise相关配置# spec/rails_helper.rb ... require 'rspec/rails' require 'devise' Dir[Rails.root.join('spec', 'support', '**', '*.rb')].sort.each { |f| require f } ... RSpec.configure do |config| ... config.expect_with :rspec do |c| c.syntax = :expect end config.include Devise::Test::IntegrationHelpers, type: :system config.include Devise::Test::IntegrationHelpers, type: :request config.include Devise::Test::ControllerHelpers, type: :controller config.include Devise::Test::ControllerHelpers, type: :view config.include Warden::Test::Helpers # 自定义辅助方法 config.include DeviseHelpers end -
添加
gem 'factory_bot_rails'到Gemfile后执行bundle install# spec/rails_helper.rb # 扩展 FactoryBot 语法 FactoryBot::SyntaxRunner.class_eval do include ActionDispatch::TestProcess include ActiveSupport::Testing::FileFixtures end RSpec.configure do |config| ... config.file_fixture_path = 'spec/fixtures/files' # 添加 factory_bot_rails 语法配置 config.include FactoryBot::Syntax::Methods ... end提示: 测试用例中使用
byebug或者binding.pry时需要修改config/environments/test.rb中的config.eager_load = true以启用预加载。 -
配置
Capybara# spec/rails_helper.rb ... RSpec.configure do |config| ... config.include Capybara::DSL # 设置 system 测试默认驱动 config.before(:each, type: :system) do driven_by :rack_test end config.before(:each, type: :system) do if ENV["SELENIUM_DRIVER_URL"].present? driven_by :selenium, using: :chrome, options: { browser: :remote, url: ENV.fetch("SELENIUM_DRIVER_URL"), desired_capabilities: :chrome } else driven_by :selenium_chrome_headless end end -
添加
Bullet# spec/rails_helper.rb RSpec.configure do |config| ... # 添加 bullet 配置 if Bullet.enable? config.before(:each) { Bullet.start_request } config.after(:each) do # Bullet.perform_out_of_channel_notifications if Bullet.notification? Bullet.end_request end end ... end
注意事项:
Capybara默认未配置app_host,导致系统测试type: :system中必须使用xxx_path绝对路由,而不是xxx_url相对路由。-
通过
config/initializers/default_url_options.rb配置Rails.application.routes.default_url_options会影响整个项目。# config/initializers/default_url_options.rb Rails.application.routes.default_url_options.merge!( host: ENV['DEFAULT_URL_HOST'] || Rails.application.credentials[:default_url_host], protocol: Rails.application.config.force_ssl ? 'https' : 'http', )
参考文档:
RSpec Rails
RSpec Core
Devise
Devise RSpec FactoryBot
RSpec+Capybara
Better Specs
Parallel Test