Ruby on rails 为什么这在Rspec zombie中不起作用。应该\u无效吗 app/models/zombie.rb 错误

Ruby on rails 为什么这在Rspec zombie中不起作用。应该\u无效吗 app/models/zombie.rb 错误,ruby-on-rails,rspec,Ruby On Rails,Rspec,僵尸 没有名称无效(失败-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_s

僵尸 没有名称无效(失败-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)>'
1)没有名称的僵尸无效
失败/错误:zombie.should\u无效
ActiveRecord::语句无效:
找不到表“僵尸”
#./spec/models/zombie_spec.rb:5:in'new'
#./spec/models/zombie_spec.rb:5:in'block(2层)in'
以0.02912秒完成 7例,1例失败

失败的示例:

rspec./spec/models/zombie_spec.rb:4#没有名称的zombie无效

随机化种子12906


您不应该在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

您是否运行了rakedb:test:load,以便在测试数据库上加载数据库的模式

此外,您的测试不正确,您正在测试您的模型是否无效,但您没有测试您的模型是否无效,因为它的名称不存在,您应该执行以下操作

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

这样,您就知道name属性有一个错误了

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

我也在学习本教程,遇到了同样的问题。我尝试了迁移,但仍然没有得到预期的结果。正如arieljuod提到的,运行
$rake db:test:load
可以解决这个问题。

您会收到什么错误消息?另外,如果:name是zombies数据库表中的一列,您不应该需要initialize方法定义的attr\u accessor行。等效功能将作为ActiveRecord的一部分提供。您是否已运行迁移来创建zombies表?
class Zombie < ActiveRecord::Base
  attr_accessible :name
  validates :name, presence: true
end
def initialize(options={})
  super
  self.name = options[:name]
end
it "is invalid without a name" do
    zombie = Zombie.new
    zombie.should_not be_valid
    zombie.errors[:name].should_not be_blank
end