Мои тесты 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. Любая идея, что происходит?