Сбой функционального теста Rails из-за ассоциации - PullRequest
0 голосов
/ 24 мая 2010

У меня есть модель учетных записей, которая содержит некоторую базовую информацию об учетной записи (имя учетной записи, веб-сайт и т. Д.).Затем у меня есть пользовательская модель, которая имеет следующее в app / models / user.rb

belongs_to :account

. У меня также есть следующее в моем маршруте. Rb

map.resources :account, :has_many => [:users, :othermodel]

проблема Iсталкиваюсь с тем, что следующий тест не пройден:

test "should create user" do
  assert_difference('User.count') do
    post :create, :user => { } #this is the line it's actually failing on
  end

  assert_redirected_to user_path(assigns(:user)) #it doesn't get here yet
end

Ошибка, которую он выдает: «Не удается найти учетную запись без идентификатора», поэтому я вроде понимаю, ПОЧЕМУ это не удается, из-за того, что это нене должен иметь объект account (или account_id как бы), чтобы знать, под какой учетной записью создается пользователь.Я пробовал варианты следующего, но я полностью потерян:

post :create, :user => { accounts(:one) } #I have the 'fixtures :accounts' syntax at the top of the test class

post :create, [accounts(:one), :user] => { }

post :create, :user => { accounts(:one), #other params for :user }

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

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

ОБНОВЛЕНИЕ:

Мне удалось выполнить тест на неудачу в другом месте, я должен был убедиться, что тест действительно может перейти к действию создания (есть некоторыеauthlogic в моем приложении)

теперь он говорит

неопределенный метод 'users' для nil: Class

Так что теперь он говорит, что может 'Я не могу найти коллекцию пользователей на моем объекте @account в контроллере, в основном потому, что он все еще не может найти @account, хотя на самом деле он не может найти нужную учетную запись.Так что мой before_filter :find_account работает до такой степени, что не ломается, но, похоже, он не находит аккаунт.

Я пробовал post :create, :id => @account.id, :user => { }, но безрезультатно.Также пробовал post :create, :account => accounts(:one), :user => { } и :user => { :account => accounts(:one) }, снова с тем же результатом.

Ответы [ 2 ]

0 голосов
/ 24 мая 2010

Типичный контроллер для стороны belongs_to ассоциации has_many будет иметь действие создания, подобное этому:

def create
  @account = Account.find(params[:account_id])
  @user = @account.users.build(params[:user])
  if @account.save
    # handle success
  else
    # handle failure
  end
end

Если ваш контроллер не выглядит так, вы не будете обрабатывать параметрыправильно, таким образом, тест не пройден.

Вы также можете проверить свои маршруты.Вы должны увидеть что-то вроде:

POST /accounts/:account_id/users(.:format) {:controller=>"users", :action=>"create"}

Это еще один признак того, что Rails устанавливает params[:account_id] значение для запрашиваемой учетной записи.

0 голосов
/ 24 мая 2010

Я думаю, что вы получили связь назад.Если это так, то модель Account должна belong_to :user, тогда модель User должна has_one :account.

В противном случае, поскольку вы создаете пользователя, который принадлежит какой-либо учетной записи, вы должны передать * 1007 учетной записи.* в параметрах:

post :create, :id => some_test_account.id, :user => {...}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...