Сопротивления shoulda должны быть validate_uniqueness_of с ошибкой

У меня есть 3 модели, пользователь, игра и плеер. В основном существует много разных отношений между пользователями и играми, а игроки - как таблица соединений, за исключением того, что у игроков есть другая информация, поэтому у нее есть своя модель.

Игроку нужна уникальная комбинация идентификатора игры и идентификатора пользователя, поэтому я попытался сказать в проигрывателе:

validates_uniqueness_of :user_id, :scope => :game_id

а затем в моей спецификации, я сказал (используя помощники по назначению):

it { should validate_uniqueness_of(:user_id).scoped_to(:game_id)}

вот те отношения, которые определяет игрок:

belongs_to :game, :inverse_of => :players
belongs_to :user, :inverse_of => :players

но я получаю ошибку ActiveRecord:: statementinvalid для этой спецификации

ActiveRecord::StatementInvalid: Mysql2::Error: Column 'game_id' cannot be null: INSERT INTO `players` ETC...

Любая идея, что пойдет не так?

Ответ 2

Пока это известная проблема, есть способ обойти ее.

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

Итак, вместо простого написания

it { should validate_uniqueness_of(:user_id) }

Вы можете написать

it do
  FactoryGirl.create(:player)
  should validate_uniqueness_of(:user_id)
end

И спецификация проверки уникальности будет работать.

Ссылка: http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/frames

Ответ 3

Вы можете прочитать о проблеме и решениях, упомянутых в официальном исходном коде caveat здесь

Одно из решений:

describe Player do
  describe "validations" do
    it do
      expect(Player.new(game_id: 1)).
        to validate_uniqueness_of(:user_id).
        scoped_to(:game_id)
    end
  end
end