2013-03-11 3 views
0

Мои тесты rspec все работают нормально, за исключением случаев, когда я дублирую объект для проверки уникальности атрибута.Ошибка rspec при тестировании дублированного объекта [Rails]

Вот модель:

приложение/модели/driver.rb

1. class Driver < ActiveRecord::Base 
2. attr_accessible :last_name, :first_name, :short_name 
# irrelevant code 
18. before_save do 
19. last_name = last_name.gsub(' ', '-').capitalize! 
20. if last_name.include? '-' 
21.  last_name[(last_name.index('-'))+1] = last_name[(last_name.index('-'))+1].capitalize! 
22. end 
23. end 
24. before_save do 
25. first_name = first_name.gsub(' ', '-').capitalize! 
26. if first_name.include? '-' 
27.  first_name[(first_name.index('-'))+1] = first_name[(first_name.index('-'))+1].capitalize! 
28. end 
29. end 
30. before_save { short_name.downcase! } 
# more irrelevant code 
59. validates :short_name, presence: true, length: { maximum: 10 }, 
60.     uniqueness: { case_sensitive: false } 

Так что проверить уникальность атрибута SHORT_NAME, дублируя объект драйвера следующим образом:

характеристики/модели/driver_spec.rb

require 'spec_helper' 

    describe Driver do 

    before do 
     @driver = Driver.new(last_name: "Driver", first_name: "Example", short_name: "exdrvr") 
    end 

    subject { @driver } 

    it { should respond_to(:last_name) } 
    it { should respond_to(:first_name) } 
    it { should respond_to(:short_name) } 

    it { should be_valid } 

    # a bunch of other tests, all of which work fine 

    describe "when short name is already taken" do 
    before do 
     driver_with_same_short_name = @driver.dup 
     driver_with_same_short_name.short_name = @driver.short_name.upcase 
     driver_with_same_short_name.save 
    end 
    it { should_not be_valid } 
    end 

Вот что я получаю, когда я бегу все испытания:

.................................F.... 

Failures: 

    1) Driver when short name is already taken 
    Failure/Error: driver_with_same_short_name.save 
    NoMethodError: 
     undefined method `gsub' for nil:NilClass 
    # ./app/models/driver.rb:19:in `block in <class:Driver>' 
    # ./spec/models/driver_spec.rb:128:in `block (3 levels) in <top (required)>' 

Finished in 1.74 seconds 
38 examples, 1 failure 

Failed examples: 

rspec ./spec/models/driver_spec.rb:130 # Driver when short name is already taken 

Таким образом, в основном все тесты работают отлично, за исключением, когда я дублировать объект драйвера. Тогда атрибут last_name вдруг равен нулю. Я попытался прокомментировать блок before_save из строк 18-23 в файле модели, и, конечно же, я получил одно и то же сообщение об ошибке для first_name. Любая идея, что происходит?

ответ

0

Обнаружена проблема: не в моих спецификациях вообще, а в блоках before_save модели. Я заменил строки 18-23 в driver.rb на

before_save { self.last_name = last_name.gsub(' ', '-').split('-').each { |x| x.capitalize! }.join('-') } 

а также для блока first_name. Теперь тесты проходят отлично. Что еще более важно, модель сейчас фактически делает то, что я намеревался сделать. Наверное, это то, для чего тестирование!

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