Rspec Custom view тестирование - PullRequest
0 голосов
/ 05 июля 2018

Это мой 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

Это действие index в expense_notifies_controller.rb

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

Как пройти тест?

1 Ответ

0 голосов
/ 05 июля 2018

Вы должны не жестко кодировать идентификаторы для назначения. Вы можете никогда убедиться, что объекты с определенным набором идентификаторов существуют для каждого запуска RSpecs в вашей базе данных.

Вместо этого создайте 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

См. Использование let в RSpecs.

Еще одно предложение: вы можете использовать factory_bot для создания User и ExpenseNotify объектов в тестовой среде.

...