Rspec 自定义视图测试
Rspec Custom view testing
这是我的 rspec 供查看
require 'rails_helper'
RSpec.describe "expense_notifies/index", type: :view do
before(:each) do
assign(:expense_notifies, [
ExpenseNotify.create!(:user_id => 1),
ExpenseNotify.create!(:user_id => 2)
])
end
it "renders a list of expense_notifies" do
render
end
end
这是 expense_notifies_controller.rb
中的 index
动作
def index
@expense_notifies = ExpenseNotify.all.includes(:user)
end
这是我的看法index.html.erb
<% @expense_notifies.each do |expense_notify| %>
<%= expense_notify.user.first_name %> <%=expense_notify.user.last_name%>
<%end%>
每次我运行rspec spec/views/expense_notifies/index.html.erb_spec.rb
Failure/Error: <%= expense_notify.user.first_name %> <%=expense_notify.user.last_name%>
ActionView::Template::Error:
undefined method `first_name' for nil:NilClass
expense_notify.rb
模型
class ExpenseNotify < ActiveRecord::Base
belongs_to :user
validates_presence_of :user_id
end
如何通过测试?
您应该不硬编码分配的 ID。您可以永不 确保数据库中每个 运行 的 RSpec 都存在具有一组特定 ID 的对象。
而是创建 User
个对象并使用 user.id
:
require 'rails_helper'
RSpec.describe "expense_notifies/index", type: :view do
let(:user_1) { User.create! }
let(:user_2) { User.create! }
before(:each) do
assign(:expense_notifies, [
ExpenseNotify.create!(user_id: user_1.id),
ExpenseNotify.create!(user_id: user_2.id)
])
end
end
查看 RSpecs 中 let
的用法。
另一个建议,您可以使用 factory_bot
在测试环境中创建 User
和 ExpenseNotify
对象。
这是我的 rspec 供查看
require 'rails_helper'
RSpec.describe "expense_notifies/index", type: :view do
before(:each) do
assign(:expense_notifies, [
ExpenseNotify.create!(:user_id => 1),
ExpenseNotify.create!(:user_id => 2)
])
end
it "renders a list of expense_notifies" do
render
end
end
这是 expense_notifies_controller.rb
index
动作
def index
@expense_notifies = ExpenseNotify.all.includes(:user)
end
这是我的看法index.html.erb
<% @expense_notifies.each do |expense_notify| %>
<%= expense_notify.user.first_name %> <%=expense_notify.user.last_name%>
<%end%>
每次我运行rspec spec/views/expense_notifies/index.html.erb_spec.rb
Failure/Error: <%= expense_notify.user.first_name %> <%=expense_notify.user.last_name%>
ActionView::Template::Error:
undefined method `first_name' for nil:NilClass
expense_notify.rb
模型
class ExpenseNotify < ActiveRecord::Base
belongs_to :user
validates_presence_of :user_id
end
如何通过测试?
您应该不硬编码分配的 ID。您可以永不 确保数据库中每个 运行 的 RSpec 都存在具有一组特定 ID 的对象。
而是创建 User
个对象并使用 user.id
:
require 'rails_helper'
RSpec.describe "expense_notifies/index", type: :view do
let(:user_1) { User.create! }
let(:user_2) { User.create! }
before(:each) do
assign(:expense_notifies, [
ExpenseNotify.create!(user_id: user_1.id),
ExpenseNotify.create!(user_id: user_2.id)
])
end
end
查看 RSpecs 中 let
的用法。
另一个建议,您可以使用 factory_bot
在测试环境中创建 User
和 ExpenseNotify
对象。