Действия по тестированию Rails на основе уникальности трех объединенных атрибутов

#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. Вы правы. Я вернулся назад, повторил шаги, обнаружил некоторые проблемы с креплениями, а затем сосредоточился на проблеме. Повторный вопрос. Я даже не уверен, что мне стоит даже беспокоиться об этом, поскольку существует проверка на уровне базы данных (и на стороне клиента также будет препятствовать ошибочному вводу).