#ruby-on-rails #testing
#ruby-on-rails #тестирование
Вопрос:
Модель имеет три ссылки, которые в совокупности должны быть уникальными
class Roleshopuser < ApplicationRecord
belongs_to :user
belongs_to :shop
belongs_to :role
validates :user_id, uniqueness: { scope: [:shop_id, :role_id] }
end
в базе данных определен соответствующий индекс:
t.index [:user_id, :shop_id, :role_id], unique: true
Однако при тестировании контроллера создайте действие
setup do
@roleshopuser = roleshopusers(:dummy)
end
test "should create roleshopuser" do
@roleshopusers = Roleshopuser.all
@roleshopusers.each do |rsu|
puts rsu.role_id
puts rsu.shop_id
puts rsu.user_id
puts "|"
end
assert_difference('Roleshopuser.count') do
post roleshopusers_url, params: { roleshopuser: { role_id: @roleshopuser.role_id, shop_id: @roleshopuser.shop_id, user_id: @roleshopuser.user_id } }
end
end
для приспособления установлены ссылки на целые числа:
dummy:
user_id: 7
shop_id: 1
role_id: 1
amp; у каждой ссылки есть приспособление с определенным отображаемым идентификатором.
Запись не сохраняется:
"Roleshopuser.count" didn't change by 1.
Expected: 8
Actual: 7
Интересно, что выходные данные существующих записей включают в себя установочную запись.
830861402
459312771
135138680
|
830861402
459312771
701618302
|
830861402
459312771
590087265
|
830861402
459312771
290770238
|
689480364
459312771
483292939
|
689480364
459312771
1058249888
|
1
1
7
|
Таким образом, проверка выполняется должным образом.
Если я изменю входные данные на:
shop_id: (@roleshopuser.shop_id 1)
Это создает запись, поскольку теперь она уникальна по отношению к предшествующей партии.
Я вижу источник проблемы: тест, созданный по умолчанию для создания лесов, в этом случае не выполняется по замыслу, поскольку он рассматривает все определенные приспособления как существующие.
Итак, как можно надежно записать тест (в конце концов, rails может придумать идентификаторы вероятности, чтобы атрибуты были идентичными — низкая вероятность, да)?
Комментарии:
1. Трудно кому-либо сказать вам, чего вам может не хватать, если нам не хватает огромных фрагментов изображения (например, контроллера и фактической настройки тестирования). Вам действительно нужно предоставить минимальный проверяемый пример для справки по отладке. И вы можете начать с простого теста, который просто проверяет проверку на уровне модели, а затем продвигается к контроллеру. Также не забывайте об индексе БД.
2. Вы правы. Я вернулся назад, повторил шаги, обнаружил некоторые проблемы с креплениями, а затем сосредоточился на проблеме. Повторный вопрос. Я даже не уверен, что мне стоит даже беспокоиться об этом, поскольку существует проверка на уровне базы данных (и на стороне клиента также будет препятствовать ошибочному вводу).