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 在测试环境中创建 UserExpenseNotify 对象。