хорошо - ответить на мой собственный вопрос (в ретроспективе) - «следи за своей шестеркой»;Это означает, что настройки, определения и крошечные «заплатки» из прошлого могут подкрасться к вам!
В моем случае, переменная окружения, которая помогает мне default-scope все мои модели, была виновником!
Это сущность документирует мою попыткучтобы доказать, что точно такой же тест проходит в консоли рельсов, при запуске с
OX_ID=1 RAILS_ENV=test r c
, который завершается неудачно при запуске мельницы с rake spec , обеспечивая такой вывод:
Running spec/models/user_spec.rb
....F
Failures:
1) User should have 1 role through user_group
Failure/Error: permission = Factory.create( :roleable, authorization: "all", ox: @ox, role: role )
ActiveRecord::RecordInvalid:
Validering fejlede: Ox skal udfyldes
# ./spec/factories/factories.rb:28:in `block (3 levels) in <top (required)>'
# ./spec/models/user_spec.rb:60:in `block (2 levels) in <top (required)>'
Finished in 2.01 seconds
5 examples, 1 failure
Failed examples:
rspec ./spec/models/user_spec.rb:56 # User should have 1 role through user_group
Будучи абсолютным новичком в тестировании Rspec и не особо довольствуясь всем стеком Rails, который, кстати, становится все выше и выше, я полностью упустил, что мой ENV ["OX_ID"] в командной строке не выжилв тестовую среду (причины, почему / как / могли бы?)
Чтобы убрать из этого
Я наконец добавил
y user.roles.to_sql
к моему тесту (что позволило мне увидеть, какой SQL Rails компилируется) - и когда я увидел вывод, я не поверил своим собственным глазам!
SELECT `roles`.* FROM `roles` INNER JOIN `roleables` ON `roles`.`id` = `roleables`.`role_id`
INNER JOIN `user_groups` ON `roleables`.`roleable_id` = `user_groups`.`id` AND `roleables`.`roleable_type`
= 'UserGroup' INNER JOIN `user_groups_users` ON `user_groups`.`id` = `user_groups_users`.`user_group_id`
WHERE `user_groups_users`.`user_id` = 3 AND (roles.ox_id=NULL) AND (roleables.ox_id=NULL)
AND (user_groups.ox_id=NULL)
(roles.ox_id=NULL)
отдал все это!Я ожидал, что он скажет roles.ox_id=1
и вот оно!