首先,我有一个有效的工厂/模型,这个特定的测试通过控制台运行良好。
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
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?
在一次大规模的问题破坏之后,事实证明我在轻微迁移后忘了rake db:test:prepare
。我仍然感到困惑,因为它可能导致这样的问题。学过的知识。跨环境运行迁移,找到更好的调试器!
答案 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
的原因是您可以在不点击数据库的情况下测试验证。