Rspec, musta, validate_uniqueness_of с областью действия и неправильное сообщение об ошибке - PullRequest
15 голосов
/ 03 июля 2011

У меня есть следующий тест Rspec:

describe Productlimit do

  before(:each) do 
    @productlimit = Factory.create(:productlimit, :user => Factory.create(:user))
  end

  subject { @productlimit }

  ...

  it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) }
  ...
end

Но я получаю следующую непонятную ошибку:

1) Productlimit 
     Failure/Error: it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down, :currency, :market_id, :user_id) }
       Expected errors to include "has already been taken" when price_cents is set to 9530, got errors: ["direction_down has already been taken (false)"]

Вы можете мне помочь? Я не понимаю, почему это не работает, потому что сообщение об ошибке кажется правильным?

EDIT:

Это происходит и в других ситуациях:

# product_spec.rb
...
it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") }  

# rake spec:models
Failure/Error: it { should validate_numericality_of(:price).with_message("price_cents must be greater than 0 (0)") }
   Expected errors to include "price_cents must be greater than 0 (0)" when price is set to "abcd", got errors: ["price_cents must be greater than 0 (0)"]

Ответы [ 6 ]

11 голосов
/ 23 ноября 2011

Чтобы проверить validate_uniqueness_of (: field), но для этого вы должны арендовать одну запись в базе данных, чтобы проверить ограничения уникальности. Вот ....

before do
  @country = FactoryGirl.create(:country, :id =>"a0000007-0000-0000-0000-000000000009",:currency_id => "a0000006-0000-0000-0000-000000000004",:merchant_id => "a0000001-0000-0000-0000-000000000002",:country_code => 'CAN', :name => 'Canada')
end

Для подтверждения уникальности

it { should validate_uniqueness_of(:country_code)}

Это сработает, попробуйте.

3 голосов
/ 15 сентября 2011

Чтобы добавить к тому, что Riche сказал о проверке уникальности: direction_down, я бы заподозрил способ, которым ваша фабрика ProductLimit генерирует значения для: direction_down.Возможно, он не всегда генерирует уникальные значения для всех атрибутов, для которых имеется проверка уникальности.

Кроме того, одна проблема, с которой я столкнулся при проверке уникальности, - это первый объект (субъект в вашем случае), созданный ранее.проверка проверки не должна иметь никаких конфликтующих значений с теми, которые фабрика генерирует «случайным образом».Чтобы проиллюстрировать это тривиальным примером,

Factory(:product_limit, :direction_down => "abc")
it { should validate_uniqueness_of(:price_cents).scoped_to(:direction_down) }

может потерпеть неудачу ошибочно , если объект, созданный средством сравнения musta, заканчивается, когда direction_down установлено в "abc", когда естьпроверка уникальности: direction_down.

2 голосов
/ 21 июля 2011

У вас есть настройки database_cleaner в sepc_helper? если нет, то добавьте

gem "database_cleaner"

в spec_helper.rb добавьте следующее в RSpec.configure block

 config.use_transactional_fixtures = false

 config.before(:suite) do
   DatabaseCleaner.strategy = :truncation
 end

 config.before(:each) do
   DatabaseCleaner.start
 end

 config.after(:each) do
   DatabaseCleaner.clean
 end

Также вы можете опубликовать заводской код? просто чтобы иметь более четкую картину.

Надеюсь, это поможет.

Также проверьте, есть ли проверка уникальности для атрибута: direction_down.

0 голосов
/ 07 марта 2013

Первый случай (с validate_uniquess_of) произошел со мной после неожиданного сбоя.Простой rake db:test:prepare исправил это.

0 голосов
/ 19 августа 2011

Ошибка не подходит для сопоставителя, потому что он жалуется на уникальность: direction_down, когда вы попросили его проверить, действительна ли уникальность: price_cents.

Содержит ли код для вашей модели validates_uniqueness_of :direction_down? Если это так, это объяснило бы сообщение.

0 голосов
/ 13 июля 2011

Попробуйте удалить test/fixtures/* и попробуйте вручную создать объект перед проверкой уникальности (без использования Factory). Также вы пробовали:

    class MyModelTest < ActiveSupport::TestCase 
...