обратный вызов after_create не работает в тесте, но работает в консоли - PullRequest
3 голосов
/ 15 марта 2011

Тестирование в Rails всегда было чем-то вроде загадки, которую я стараюсь избегать, если это возможно, но я собираю производственное приложение, за которое люди будут платить, поэтому мне действительно нужно протестировать. Эта проблема сводит меня с ума, потому что тест не пройден, но когда я выполняю те же команды в консоли (в режиме тестирования и разработки), он работает нормально.

user_test.rb

test "should update holidays booked after create"
  user = users(:robin)
  assert_equal user.holidays_booked_this_year, 4 # this passes
  absence = user.absences.create(:from => "2011-12-02", :to => "2011-12-03", :category_id => 1, :employee_notes => "Secret") # this works
  assert_equal user.holidays_booked_this_year, 5 # fails
end

absence.rb

after_create :update_holidays_booked

def update_holidays_booked
  user = self.user
  user.holidays_booked_this_year += self.days_used # the days used attribute is calculated using a before_create callback on the absence
  user.save
end

Я только думаю, что это связано с обновлением модели User посредством обратного вызова для модели Absence, но, как я уже сказал, это работает в консоли.

Любой совет будет оценен.

Спасибо

Robin

1 Ответ

4 голосов
/ 15 марта 2011

Что вы используете для своей фабрики?

Если вы используете тест на основе базы данных, вам необходимо перезагрузить пользователя в тесте (поскольку экземпляр пользователя не обновляется, пользователь отсутствия обновляется исохранение в базу данных), перезагрузка пользователя будет выглядеть следующим образом:

assert_equal user.reload.holidays_booked_this_year, 5

Я бы также предположил, что отсутствие должно иметь пользователя, поэтому вы должны использовать build вместо create, чтобы внешний ключ для пользователя былчасть "созданного" экземпляра:

user.absences.build

Первое предположение: в консоли вы работаете с реальным пользователем в базе данных, тогда как тест является фикстурой.Вы пробовали, что это в тесте?:

raise user.inspect

Посмотрите на вывод и определите, с каким пользователем вы на самом деле работаете, и что это за атрибуты праздничные дни."сделать" после описания)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...