为什么这在Rspec zombie.should_not be_valid中不起作用

时间:2012-09-25 04:07:44

标签: ruby-on-rails rspec

应用程序/模型/ zombie.rb

class Zombie < ActiveRecord::Base
    attr_accessible :name
    validates :name, presence: true
end

规格/模型/ zombie_spec.rb

require 'spec_helper'

describe Zombie do

    it "is invalid without a name" do
        zombie = Zombie.new
        zombie.should_not be_valid
    end
end

错误

  

僵尸        没有名字无效(FAILED - 1)      故障:

 1) Zombie is invalid without a name
    Failure/Error: zombie.should_not be_valid
    ActiveRecord::StatementInvalid:
      Could not find table 'zombies'
    # ./spec/models/zombie_spec.rb:5:in `new'
    # ./spec/models/zombie_spec.rb:5:in `block (2 levels) in <top (required)>'
     

以0.02912秒结束      7个例子,1个失败

     

失败的例子:

     

rspec ./spec/models/zombie_spec.rb:4#Zombie没有名字无效

     

随机种子12906

4 个答案:

答案 0 :(得分:0)

您不应该在ActiveRecord类中定义initialize方法。

当我定义了initialize方法时,会出现此错误:

 Failure/Error: zombie = Zombie.new
 NoMethodError:
   undefined method `delete' for nil:NilClass

没有它,它就像你期望的那样传递。

因此,请将您的模型更改为以下内容,您的规格将通过。

class Zombie < ActiveRecord::Base
  attr_accessible :name
  validates :name, presence: true
end

或者......如果您认为有必要,请务必先致电super

def initialize(options={})
  super
  self.name = options[:name]
end

答案 1 :(得分:0)

你运行rake db:test:load所以在测试数据库上加载了db的架构吗?

你的测试也不对,你正在测试你的模型是无效的,但你没有测试你的模型是无效的,因为它的名字不存在,你应该做类似的事情

it "is invalid without a name" do
    zombie = Zombie.new
    zombie.should_not be_valid
    zombie.errors[:name].should_not be_blank
end

这样你真的知道name属性有错误

答案 2 :(得分:0)

谢谢大家,我没有运行迁移所以运行rake db:migrate修复它

答案 3 :(得分:0)

我也正在完成本教程并遇到同样的问题。我对迁移进行了调整,但仍未获得预期的结果。正如arieljuod所提到的,运行$ rake db:test:load可以解决问题。