Ruby on rails 3.2 测试重复对象[Rails]时出现rspec错误

Ruby on rails 3.2 测试重复对象[Rails]时出现rspec错误,ruby-on-rails-3.2,rspec-rails,Ruby On Rails 3.2,Rspec Rails,我的rspec测试运行正常,除非复制对象以测试属性的唯一性 模型如下: app/models/driver.rb 以下是我运行所有测试时得到的结果: .................................F.... Failures: 1) Driver when short name is already taken Failure/Error: driver_with_same_short_name.save NoMethodError:

我的rspec测试运行正常,除非复制对象以测试属性的唯一性

模型如下:

app/models/driver.rb

以下是我运行所有测试时得到的结果:

.................................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
。。。。
失败:
1) 已使用短名称时的驱动程序
失败/错误:驱动程序\u与\u相同\u短\u名称。保存
命名错误:
nil:NilClass的未定义方法“gsub”
#./app/models/driver.rb:19:in'block in'
#./spec/models/driver_spec.rb:128:in'block(3层)in'
以1.74秒完成
38例,1例失败
失败的示例:
rspec./spec/models/driver_spec.rb:130#已使用短名称时的驱动程序

所以,基本上所有的测试都运行良好,除了我复制驱动程序对象时。然后last_name属性突然变为nil。我试着从模型文件的第18-23行注释出before_save块,当然,对于first_name,我只得到了相同的错误消息。知道发生了什么吗?

发现了问题:根本不在我的规格中,而是在模型的保存块之前。我将driver.rb中的第18-23行替换为

before_save { self.last_name = last_name.gsub(' ', '-').split('-').each { |x| x.capitalize! }.join('-') }
对于first_name块也是如此。测试现在运行良好。更重要的是,这个模型现在实际上正在做我想做的事情。我想这就是测试的目的

.................................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
before_save { self.last_name = last_name.gsub(' ', '-').split('-').each { |x| x.capitalize! }.join('-') }