ruby on rails - No se puede obtener un pase de prueba de validación de singularidad con el emparejador de Shoulda
ruby-on-rails ruby-on-rails-3 (2)
Además de lo anterior, un patrón que he usado que lo resuelve:
RSpec.describe AvatarPart, :type => :model
describe ''validations'' do
let!(:avatar_part) { create(:avatar_part) }
it { should validate_uniqueness_of(:some_attribute) }
it { should validate_uniqueness_of(:other_attribute) }
end
end
Tengo un matcha shoulda en mi avatar_parts_spec.rb y no puedo pasarlo:
Prueba:
require ''rails_helper''
RSpec.describe AvatarPart, :type => :model do
it { should validate_presence_of(:name) }
it { should validate_presence_of(:type) }
it { should validate_uniqueness_of(:name).case_insensitive }
it { should belong_to(:avatar) }
end
Modelo:
class AvatarPart < ActiveRecord::Base
attr_accessible :name, :type, :avatar_id
belongs_to :avatar
validates_uniqueness_of :name, case_sensitive: false
validates :name, :type, presence: true, allow_blank: false
end
Migración:
class CreateAvatarParts < ActiveRecord::Migration
def change
create_table :avatar_parts do |t|
t.string :name, null: false
t.string :type, null: false
t.integer :avatar_id
t.timestamps
end
end
end
Error:
1) AvatarPart should require unique value for name
Failure/Error: it { should validate_uniqueness_of(:name).case_insensitive }
ActiveRecord::StatementInvalid:
SQLite3::ConstraintException: NOT NULL constraint failed: avatar_parts.type: INSERT INTO "avatar_parts" ("avatar_id", "created_at", "name", "type", "updated_at") VALUES (?, ?, ?, ?, ?)
¿Cuál podría ser la causa del error?
Edición: repositorio de Github: https://github.com/preciz/avatar_parts
La documentación para ese emparejador dice:
Este emparejador funciona de forma un poco diferente a otros emparejadores. Como se señaló anteriormente, creará una instancia de su modelo si aún no existe una. A veces, este paso falla, especialmente si tiene restricciones a nivel de base de datos en cualquier atributo que no sea el único. En este caso, la solución es llenar estos atributos antes de llamar a
validate_uniqueness_of
.
Entonces en tu caso la solución sería algo como:
describe "uniqueness" do
subject { AvatarPart.new(name: "something", type: "something else") }
it { should validate_uniqueness_of(:name).case_insensitive }
end