переопределить пользовательскую проверку - PullRequest
0 голосов
/ 05 июля 2018

С ruby on rails у меня есть модель player, у которой много games. Однако игрок должен иметь как минимум три игры. У меня есть собственный валидатор, который добавляет к ошибкам, если нет трех игр. Я могу создать игрока с тремя играми, объявив в player модель

accepts_nested_attributes_for :games

и используйте вложенный хэш атрибутов игрока и игры для создания player и его игр.

Однако в целях тестирования я иногда хочу добавлять игры по одной, используя rspec код, такой как

player = create: :player
game = create :game
player.games << game

Но это не будет работать, потому что create :player запускает пользовательскую проверку и завершается ошибкой, потому что в ней нет трех игр.

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

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я бы не предложил бы пропустить ваши проверки, даже в ваших Rspecs, если этого нельзя избежать. Если возможно , измените ваши Rspecs так, чтобы они соответствовали проверкам.

Вы могли бы сделать что-то вроде этого:

let(:player) { build(:player) }
let(:game) { create(:game) }
let(:another_game) { create(:game) }
let(:one_more_game) { create(:game) }

it 'test something' do
  player.games += [game]

  # Do your stuff

  player.games += [another_game]

  # Do some more stuff

  player.games += [one_more_game]

  # and now that `player` object is valid, you can do:
  player.save!

  # Check your expectations here
end

Примечание:

  • Вместо создания объекта player без игр я создаю объект player, что разрешено. Вам не нужно создавать что-то, если вам это действительно не нужно.
  • Я изменил ваши переменные с использованием let. Они лучше подходят для Rspecs.

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

0 голосов
/ 05 июля 2018

Вы можете использовать пользовательские методы для сохранения объектов

factory :player do
  to_create {|instance| instance.save(validate: false) }
end

https://github.com/thoughtbot/factory_bot/blob/master/GETTING_STARTED.md#custom-methods-to-persist-objects

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