2015-03-30 4 views
1

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

Моя модель:

class Product < ActiveRecord::Base 
    validates :title, :description, :image_url, presence: true 
    validates :price, numericality: {greater_than_or_equal_to: 0.01} 
    validates :title, uniqueness: true 
    validates :image_url, allow_blank: true, format: { 
    with: %r{\.(gif|jpg|png)\Z}i, 
    message: 'must be a URL for GIF, JPG or PNG image' 
    } 
end 

мой тест:

describe "when creating products with identical names" do 
    let(:book1) { FactoryGirl.create(:product, title: 'identical') } 
    let(:book2) { FactoryGirl.build(:product, title: 'identical') } 

    it "raises unique validation error" do 
     expect(book2).not_to be_valid 
    end 
end 

это то, что я получаю:

1) Product when creating products with identical names raises unique validation error 
    Failure/Error: expect(book2).not_to be_valid 
     expected #<Product id: nil, title: "identical", description: "Some crazy wibbles, that are fun", image_url: "freddie_mercury.jpg", price: #<BigDecimal:7f995cdd1358,'0.5699E2',18(27)>, created_at: nil, updated_at: nil> not to be valid 

Я могу даже написать два раза FactoryGirl.create, он просто экономит ,

Однако, если я переключусь на консоль рельсов и попытаюсь создать два объекта с двумя идентичными именами, я получаю сообщение об ошибке. Что-то не так с моей тестовой средой?

ответ

1

Ну, book1 не создается в вашем тестовом прогоне ... рассмотреть вопрос об изменении:

describe "when creating products with identical names" do 
    let(:book1) { FactoryGirl.create(:product, title: 'identical') } 
    let(:book2) { FactoryGirl.build(:product, title: 'identical') } 

    it "raises unique validation error" do 
    expect(book2).not_to be_valid 
    end 
end 

в

describe "when creating products with identical names" do 
    let(:book) { FactoryGirl.build(:product, title: 'identical') } 

    before do 
    FactoryGirl.create(:product, title: 'identical') 
    end 

    it "raises unique validation error" do 
    expect(book).not_to be_valid 
    end 
end 

Это должно помочь! Удачи!

+1

спасибо! Правильно ли я понимаю, что блок let() не выполняет по существу действие внутри блока? Итак, в основном в book1 я просто сохранил действие вместо того, чтобы выполнять это действие? – mohnstrudel

+0

На самом деле, что «пусть» вы можете представить как «регистрацию» метода имени, указанного как символ, поэтому 'let (: book1) {...}' позволяет вызывать 'book1' в ваших тестах. Пока вы не вызовете метод, тело блока не будет выполнено. Вы можете проверить это, если в вашем исходном коде вы выполнили что-то вроде 'before {book1}' или в вашем блоке 'it', просто называемом' book1', перед 'expect (book2) .not_to be_valid'. Однако ни один из них не кажется читаемым. –

+0

Удивительный! Спасибо (-: – mohnstrudel

Смежные вопросы