代码之家  ›  专栏  ›  技术社区  ›  TiggerToo

带Shoulda和多个范围的Rails Uniques未通过测试

  •  0
  • TiggerToo  · 技术社区  · 5 年前

    我在这里做错什么了?我很确定实际的代码是正确的,但是我的测试有问题,这只是一个失败的shoulda matchers?还是我错过了什么?

    require 'rails_helper'
    
    RSpec.describe Game, type: :model do
      subject { create :game }
    
      it { should belong_to(:home_team).class_name('Team') }
      it { should belong_to(:away_team).class_name('Team') }
    
      it { should validate_uniqueness_of(:start_date).scoped_to(:home_team_id) }
      it { should validate_uniqueness_of(:start_date).scoped_to(:away_team_id) }
    end
    
    class Game < ActiveRecord::Base
      belongs_to :home_team, class_name: 'Team'
      belongs_to :away_team, class_name: 'Team'
    
      validates_uniqueness_of :start_date, scope: :home_team_id
      validates_uniqueness_of :start_date, scope: :away_team_id
    end
    
       Expected Game to validate that :start_date is case-sensitively unique
       within the scope of :home_team_id, but this could not be proved.
         Given an existing Game whose :start_date is ‹Fri, 31 Aug 2018 05:24:25
         UTC +00:00›, after making a new Game and setting its :start_date to
         ‹Fri, 31 Aug 2018 05:24:25 UTC +00:00› as well and its :home_team_id
         to a different value, ‹5›, the matcher expected the new Game to be
         valid, but it was invalid instead, producing these validation errors:
    
         * start_date: ["has already been taken"]
    
    1 回复  |  直到 5 年前
        1
  •  1
  •   Vasilisa    5 年前

    对不起,我以前的回答不正确。看起来Shoulda不能自动处理你的案子。它改变 home_team_id 希望游戏是有效的,但它还是一样的 away_team_id ,因此您需要手动验证它

    it 'validates uniqueness for both teams' do
      team1 = create :team
      team2 = create :team
      team3 = create :team
      game = create :game, home_team: team1, away_team: team2
      game1 = build :game, home_team: team1, away_team: team3
      game2 = build :game, home_team: team3, away_team: team2
      game3 = build :game, home_team: team2, away_team: team1
    
      expect(game).to be_valid
      expect(game1).not_to be_valid
      expect(game2).not_to be_valid
      expect(game3).to be_valid
    end