RSpec和ActiveRecord在Rails中的应用:如何编写有效的测试

3

我已经建立了一个简单的Rails应用程序,其中包含三个继承自ActiveRecord的类。在测试驱动开发方面,我已经写好了需要测试的类。到目前为止,我编写的所有测试都很顺利。对象被创建、属性正常响应,验证都已经就位。

问题出现在当我在我的创建方法上使用 "!" 时,因为现在对象被一直传递到数据库中。与其它情况下拦截无效输入的正常验证不同,似乎数据库有机会对刺激做出反应。

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

ActiveRecord::RecordInvalid: Validation failed: Shop is too long (maximum is 11 characters)

我很高兴能得到这个错误,但希望知道如何更好地在我的测试中计划它。产生上述错误的代码是:

  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个回答

4
Shoulda gem使测试验证变得轻而易举。最近的shoulda版本是作为RSpec的扩展构建的。
你可以在这里找到特定类型验证的文档。
你最终会得到像这样的测试代码。
describe Department do
  it { should ensure_length_of(:id).is_at_most(11) }
end

3

你需要捕获create!抛出的异常。按照你的写法,异常被rspec所捕获。

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

对于create!而言,should_not be_valid测试是没有意义的,因为它会抛出异常,除非对象是有效的。


你是对的,但另一种解决方案更加优雅。不过,你提供了一个没有多余代码的解决方案,我会给你投票的。 - Bnjmn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接