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 与非常有限的正则表达式匹配。
我试图通过制作经常共享的部分 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 与非常有限的正则表达式匹配。