RSpec和ActiveRecord for Rails:如何编写有效的测试

时间:2011-09-06 03:03:11

标签: ruby-on-rails ruby activerecord rspec

到目前为止,我已经构建了一个简单的rails应用程序,其中有三个类继承自ActiveRecord。我在测试驱动开发方面领先一步,因为我已经编写了我需要测试的类。到目前为止,我写的测试都很顺利。正在创建对象,属性正在响应,验证都已到位。

当我调用“!”时问题就开始了。在我的创建方法上,因为现在对象一直传递到数据库。而不是我的正常验证拦截无效输入,似乎数据库有机会响应刺激。

到目前为止,我在运行测试时收到的错误是:

的ActiveRecord :: RecordInvalid:    验证失败:商店太长(最多11个字符)

我很高兴我收到此错误,但想知道如何在我的测试中更好地规划它。生成上述错误的代码是:

  it "should not a accept a department with a shopify shop_id that's over 11 chars" do
    long_id = "9" * 12
    long_id_department = Department.create!(@attr.merge(:id => [long_id, ""]))
    long_id_department.should_not be_valid
  end

我认为这一行特别应该采用其他形式:long_id_department.should_not be_valid

希望大家能够了解那种形式应该是什么。

2 个答案:

答案 0 :(得分:4)

shoulda宝石使您的验证测试成为一块蛋糕。最新的shoulda版本是作为RSpec的附加组件构建的。

您正在尝试的特定验证类型的文档是here.

你最终会得到看起来像这样的测试代码。

describe Department do
  it { should ensure_length_of(:id).is_at_most(11) }
end

答案 1 :(得分:3)

您需要捕获create!抛出的异常。正如你所写的那样,rspec会抓住异常。

lambda do
 long_id_department = Department.create!(@attr.merge(:id => [long_id, ""]))
end.should raise_error

对于create,should_not be_valid测试毫无意义!因为除非对象有效,否则它将抛出异常。