【问题标题】:testing uniqueness scope validation using shoulda matchers使用 shoulda 匹配器测试唯一性范围验证
【发布时间】:2014-09-09 10:37:12
【问题描述】:

我有一个模型

class ObjectiveConcept < ActiveRecord::Base
  validates :objective_id, presence: true
  validates :concept_id, presence: true
  validates :concept_id, uniqueness: {scope: :objective_id}

  belongs_to :objective
  belongs_to :concept
end

使用 shoulda 匹配器的模型验证如下

require 'spec_helper'                                                                                                                                   

describe ObjectConcept do

 describe "#Validations" do
   it{ should validate_presence_of(:objective_id) }

   it{ should validate_presence_of(:concept_id) }

   it 'should validate uniqueness of concept_id scoped to object_id' do
     objective = FactoryGirl.create(:objective, name: 'some objective')

     concept = FactoryGirl.create(:concept, name: 'some concept')

     subject { FactoryGirl.create(:object_concept, concept_id: concept.id, objective_id: objective.id) }
     should validate_uniqueness_of(:concept_id).scoped_to(:objective_id)
    end
  end

  describe "#Associations" do
    it{ should belong_to(:objective) }
    it{ should belong_to(:concept) }
  end
end

当我运行唯一性规范时,我得到以下错误

 ObjectiveConcept#Validations should validate uniqueness of concept_id scoped to objective_id
 Failure/Error: should validate_uniqueness_of(:concept_id).scoped_to(:objective_id)
 ActiveRecord::StatementInvalid:
   PG::Error: ERROR:  null value in column "objective_id" violates not-null constraint
   DETAIL:  Failing row contains (20, null, 0, 2014-09-09 10:24:36.87583, 2014-09-09 10:24:36.87583).
   : INSERT INTO "objective_concepts" ("concept_id", "created_at", "objective_id", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"

我已按照http://rubydoc.info/github/thoughtbot/shoulda-matchers/master/Shoulda/Matchers/ActiveModel#validate_uniqueness_of-instance_method 的“警告”部分中指定的唯一性验证填充主题,但没有效果。我该如何解决这个问题?

【问题讨论】:

    标签: validation ruby-on-rails-4 unique shoulda


    【解决方案1】:

    通过从主题块中删除代码来修复它。

    替换

    subject { FactoryGirl.create(:object_concept, concept_id: concept.id, objective_id: objective.id) } 
    

    FactoryGirl.create(:object_concept, concept_id: concept.id, objective_id: objective.id)
    

    【讨论】:

      猜你喜欢
      • 2015-01-18
      • 2013-09-12
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 2023-03-07
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多