RSpec 2 уникальность тестирования - PullRequest
1 голос
/ 09 сентября 2011

Я знаю, что должен тестировать валидации, но я учусь, поэтому хотел бы знать, почему мой код не работает.

Среда Ruby 1.9.2, Rails 3.1, RSpect 2.6.4

Я получил модель продукта:

class Product < ActiveRecord::Base
  attr_accessor :title, :description, :image_url, :price

  validates_presence_of :title, :description, :image_url, :message => "can't be blank"
  validates_uniqueness_of :title, :message => "must be unique"
  validates_numericality_of :price, :greater_than_or_equal_to => 0.01, :message => "must be a number greater than 0"
  validates_format_of :image_url, :with => %r{\.(gif|jpg|png)$}i, :message => "is a invalid image file"
end

в спецификации / models / product_spec.rb:

require 'spec_helper'

describe Product do

  before(:each) do
    @attr = { 
      :title => "Lorem Ipsum",
      :description => "Wibbling is fun!",
      :image_url => "lorem.jpg",
      :price => 19.99
    }
  end

  it "rejects duplicated titles" do
    Product.create!(@attr)
    product_with_duplicate_title = Product.new(@attr)
    product_with_duplicate_title.should_not be_valid
  end
end

Когда я запускаю Rspec Rack, я получаю:

Failures:

  1) Product should reject if the title is duplicated
     Failure/Error: product_with_duplicate_title.should_not be_valid
       expected valid? to return false, got true
     # ./spec/models/product_spec.rb:26:in `block (2 levels) in <top (required)>

Почему? Я также попробовал нечто подобное, используя factory_girl, и получил тот же результат ... другие тесты (не включенные здесь) для проверки пробелов, правильных имен файлов изображений и т. Д., Все работало.

Спасибо заранее.

Ответы [ 2 ]

9 голосов
/ 09 сентября 2011

Тебе лучше пойти по гораздо более простому пути: использовать спички musta вместе с Rspec.Вы бы просто написали:

describe Product do
  it { should validate_uniqueness_of(:title) }
end

Док здесь .

0 голосов
/ 24 сентября 2011

Ваш вопрос выглядит правильным, я не понимаю, почему он не работает. Я заметил, что вы все еще используете старый синтаксис Rails 2.x, который был объявлен устаревшим в Rails 3. Это не должно быть проблемой, я думаю, что синтаксис все еще поддерживается в Rails 3.1.

Вот как бы я написал нечто подобное:

class Product < ActiveRecord::Base
  validates :title, :presence => true, :uniqueness => true
end

Использование FactoryGirl, как упомянуто выше Iain.

let(:product) { FactoryGirl.build(:product) }    

it "has a unique title" do
  older_product = FactoryGirl.create(:product)
  product.title = older_product.title
  product.should_not be_valid
end

Можете ли вы попытаться распечатать ошибки? Может быть, дело не в уникальности заголовка, а в другом поле?

...