Тестирование контроллера Rspec с ассоциациями - PullRequest
2 голосов
/ 20 февраля 2010

У меня есть две модели:

class Solution < ActiveRecord::Base
  belongs_to :user

  validates_attachment_presence :software
  validates_presence_of :price, :language, :title
  validates_uniqueness_of :software_file_name, :scope => :user_id

  has_attached_file :software
end


class User < ActiveRecord::Base
  acts_as_authentic
  validates_presence_of :first_name, :last_name, :primary_phone_number
  validates_uniqueness_of :primary_phone_number

  has_many :solutions
end

мои маршруты выглядят так:

map.resources :user, :has_many => :solutions

Теперь я пытаюсь протестировать мои контроллеры решений с помощью следующего теста RSpec:

describe SolutionsController do

  before(:each) do
    @user = Factory.build(:user)
    @solution = Factory.build(:solution, :user => @user)
  end

 describe "GET index" do
   it "should find all of the solutions owned by a user" do
     Solution.should_receive(:find_by_user_id).with(@user.id).and_return(@solutions)
     get :index, :id => @user.id
   end
 end
end

Однако, я получаю следующую ошибку:

ActionController::RoutingError in 'SolutionsController GET index should find all of the solutions owned by a user'
No route matches {:id=>nil, :controller=>"solutions", :action=>"index"}

Может кто-нибудь указать мне, как я могу это проверить, так как индекс всегда должен вызываться в рамках определенного пользователя?

Ответы [ 2 ]

5 голосов
/ 20 февраля 2010

Factory#build создает экземпляр класса, но не сохраняет его, поэтому у него еще нет идентификатора.

Итак, @user.id равно нулю, поскольку @user не было сохранено.

Поскольку @user.id равен нулю, ваш маршрут не активирован.

попробуйте вместо этого использовать Factory#create.

  before(:each) do
    @user = Factory.create(:user)
    @solution = Factory.create(:solution, :user => @user)
  end
1 голос
/ 21 февраля 2010

Похоже, ваша другая проблема в этой строке:

 get :index, :id => @user.id

Вы пытаетесь сделать запрос к методу index, но вы указали неверное имя переменной. При тестировании SolutionsController id подразумевается идентификатор решения, вам необходимо указать идентификатор пользователя. Это должно сработать или, по крайней мере, продвинуть вас вперед:

 get :index, :user_id => @user.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...