Rspec / Guard / FactoryGirl返回错误的“未定义方法”错误

时间:2013-01-28 23:20:35

标签: ruby-on-rails rspec factory-bot guard spork

首先,我有一个有效的工厂/模型,这个特定的测试通过控制台运行良好。

模型

validate :some_condition

def some_condition
  errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
end

测试

it "should not allow values above 5" do
  model = FactoryGirl.create(:model) # creates valid model
  model.attribute = 10
  model.valid?.should be_false
end

在控制台中:

model = FactoryGirl.create(:model)
model.attribute = 10
model.valid? # => false

在rspec中

undefined method `<' for nil:NilClass

我无法理解为什么会这样。这显然与self.attribute有关,但为什么它会在控制台中运行,而不是在测试中呢?仅attribute也会返回相同的错误,我已经检查过, - self被定义为模型实例。无论如何,这并不能解释不一致性。它在控制台中的工作模式和属性完全相同。

要注意:我已经重新启动了所有环境,这是基于新的重新加载。

更新

在一种绝望的行为中,我在这种情况之前的几个环境中输出了attribute,然后exit。这带来了更奇怪的结果。解决这个问题:

def some_condition
  puts self.attribute # => returns blank in test, attribute value otherwise
  puts "#{self.attribute}" # => returns attribute value in test!!!
  exit

  errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
end

以上让我非常紧张。我现在需要测试来测试我的测试吗?真的希望有更多经验丰富的ruby或上面的工具对这个烂摊子有一些合理的解释,因为我完全迷失了。

导致这种可憎的行为:

errors.add(:attribute, "cannot be less than 5") if self.attribute < 5
# => IN TESTS self.attribute returns nil

errors.add(:attribute, "cannot be less than 5") if "#{self.attribute}".to_i < 5
# => IN TESTS self.attribute returns value! This works!?
你甚至转向哪里?是红宝石,铁轨,工厂女孩,rspec?

FIX

在一次大规模的问题破坏之后,事实证明我在轻微迁移后忘了rake db:test:prepare。我仍然感到困惑,因为它可能导致这样的问题。学过的知识。跨环境运行迁移,找到更好的调试器!

1 个答案:

答案 0 :(得分:0)

RSpec语法在版本1到2之间发生了一些变化,这可能会让人感到困惑。

你能告诉我如果你完全按照这样的方式编写测试会发生什么吗?

it "should not allow values above 5" do
  model = build(:model, :attribute => 10)
  model.should_not be_valid
  model.should have(1).error_on(:attribute)
end

我使用build而不是create的原因是您可以在不点击数据库的情况下测试验证。