Rails 控制器测试 Rspec

Rails controller test with Rspec

我试图通过制作经常共享的部分 html.erb 文件(例如 _form.html.erb

来组织代码

我想检查我的部分代码是否适用于不同的 models/controllers,所以我从视图中手动执行 CRUD。

使用 Rspec 自动测试我的代码会更好,但我不知道。谁能给我一些如何使用 Rspec 测试控制器代码的指导?

检查部分代码是否适用于不同 models/controllers。您可以在控制器规格中添加 render_views

如何使用 Rspec 测试控制器代码? 阅读官方文档 https://relishapp.com/rspec/rspec-rails/docs/controller-specs

此页面可能会有所帮助:https://thoughtbot.com/blog/how-we-test-rails-applications

要一起测试控制器和视图,请编写 feature specs and request specs .

请求规范是较低级别的规范,您可以在其中向您的应用程序发送 HTTP 请求并编写关于响应的期望(在 TDD 术语中也称为断言)。它们是 ActionDispatch::IntegrationTest 的包装器。请求规范应被视为控制器规范的替代品,RSpec 和 Rails 团队不鼓励使用控制器规范。

# spec/requests/products_spec.rb
require 'rails_helper'
RSpec.describe "Products", type: :request do
  describe "GET /products" do
     let!(:products) { FactoryBot.create_list(:product, 4) }
     it "contains the product names" do
        get "/products"
        expect(response).to include products.first.name
        expect(response).to include products.last.name
     end
  end
end

功能规范是关注用户故事的更高级别的规范。它们通常用作验收测试。他们使用名为 Capybara 的浏览器模拟器,模拟用户在应用程序中的点击方式。 Capybara 还可以通过 selenium 运行 无头浏览器(无头 chrome、firefox、phantom js、webkit 等)和 "real" 浏览器。最小等效项是 ActionDispatch::SystemTestCase,但 RSpec 功能没有包装它(花了 minitest/testunit 年才赶上这里)。

# Gemfile
gem 'capybara'
# spec/features/products_spec.rb
require 'rails_helper'
RSpec.feature "Products" do
  let!(:products) { FactoryBot.create_list(:product, 4) }

  scenario "when a user views a product" do
    visit '/'
    click_link 'Products'
    click_link products.first.name
    expect(page).to have_content products.first.name
    expect(page).to have_content products.first.description
  end
end

此规范测试 products#index 和 products#show 操作以及根页面和相关视图。

两种类型的规格各有优缺点。功能测试适用于测试大范围的应用程序,但很繁重。请求规范更快,并且更容易复制导致 bug/issue 的特定请求,但您基本上只是将 HTML 与非常有限的正则表达式匹配。