RSpec 集成

RSpec 集成

  1. 添加 gem 'rspec-rails' 到Gemfile后执行bundle install`

  2. 执行 rails g rspec:install 生成 rspec 配置

  3. 添加 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
    
  4. 添加 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 以启用预加载。

  5. 配置 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
    
  6. 添加 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Awesome Ruby Toolbox Awesome A collection of awesome Ruby...
    debbbbie阅读 8,056评论 0 3
  • 1. 新建一个名为blog项目,设置数据库为mysql,跳过测试 $ rails new blog -d mysq...
    商鲲阅读 2,383评论 0 0
  • 这里,我的集成测试用的是capybara+rspec 一、有Gemfile里添加gem引用 gem 'rspec...
    limx阅读 2,939评论 0 0
  • 一、为什么需要测试: 测试对于程序来说,不是必不必要的问题,而是怎么测的问题。就算不写测试,你一样在人肉测试。只不...
    GALAXY_ZMY阅读 6,756评论 0 3
  • 以下是一些关于测试的基本gem的引入和初始化,方便以后copy&past。 1. 引入gem 执行 bundle....
    我要走多远阅读 2,755评论 0 1

友情链接更多精彩内容