RSpec: controller_specs для ресурса с отношениями - PullRequest
0 голосов
/ 18 февраля 2012

Я знаю, что это основной вопрос, но там так много запутанной, устаревшей и противоречивой информации ... Мне удалось взломать мой мозг ... Как лучше получить доступ к родительской модели из спецификации контроллера ребенка ... с помощью FactoryGirl?

Может быть частично , связанным с использованием значения из родительской модели (user.name) в (to_params) дочернего элемента. Это работает нормально для меня. Я просто испытываю трудности с тестированием:

Псевдо модели:

User
  :name - string - unique
  :email - string - unique
  has_many :ballots

Ballot
  belongs_to :user
  has_many :items

  def to_param #
    "#{id} #{user.name}".parameterize
  end

factories.rb:

FactoryGirl.define do
  sequence :email do |n|
    "person#{n}@fake_mail.com"
  end

  sequence :name do |n|
    "Person#{n}"
  end

  factory :user do
    name "Joe Schmo"
    email
  end

  factory :sequenced_user, :parent => :user do
    name
    email
  end

  factory :ballot do
    sequenced_user
  end

ballots_controller_spec.rb:

describe BallotsController do

  def valid_attributes
    FactoryGirl.attributes_for(:ballot)
  end

  describe "GET show" do
    it "assigns the requested ballot as @ballot" do
      ballot = Ballot.create! valid_attributes
      get :show, {:id => ballot.to_param}, valid_session
      assigns(:ballot).should eq(ballot)
    end
  end

  ...

end

ошибка спецификации:

  1) BallotsController GET show assigns the requested ballot as @ballot
     Failure/Error: get :show, {:id => ballot.to_param}, valid_session
     NoMethodError:
       undefined method `name' for nil:NilClass
     # ./app/models/ballot.rb:5:in `to_param'
     # ./spec/controllers/ballots_controller_spec.rb:53:in `block (3 levels) in <top (required)>'

  ...

Проблема, по-видимому, в том, что действующая спецификация не имеет доступа к name Пользователя, с которым связано голосование. Но на фабрике бюллетеней есть связанный пользователь!?! Итак, как правильно создать эти отношения с помощью FactoryGirl?

1 Ответ

0 голосов
/ 18 февраля 2012

Можете ли вы попробовать:

factory :ballot do
  association :user, :factory => :sequenced_user
end

Похоже, что FactoryGirl пыталась сделать ballot.sequenced_user, когда вы хотите просто ballot.user

...