【问题标题】:RSpec and ActiveRecord for Rails: How to write effective testsRails 的 RSpec 和 ActiveRecord:如何编写有效的测试
【发布时间】:2011-11-10 23:41:10
【问题描述】:

到目前为止,我已经构建了一个简单的 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

希望大家能对这种形式应该是什么有所了解。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rspec


    【解决方案1】:

    您需要捕获由 create! 引发的异常。正如您所写,异常正在被 rspec 捕获。

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

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

    【讨论】:

    • 你的权利,但其他解决方案更优雅一点。但是,您将获得投票以提供不增加脂肪的解决方案。
    【解决方案2】:

    shoulda gem 让测试验证变得轻而易举。最新的 shoulda 版本是作为 RSpec 的附加组件构建的。

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

    您最终会得到如下所示的测试代码。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多