【问题标题】:Should one unit test persistence in rails?是否应该在 Rails 中测试持久性?
【发布时间】:2012-02-27 21:42:02
【问题描述】:

我们正在使用 RSpec 2 进行 rails 3.2.1 项目。我的问题是,我是否应该测试每个 activerecord 模型的基本持久性?我曾经在 C#/NHibernate 时代这样做,以确保存在正确的表/映射。

所以如果我有一个客户的姓名、地址和电话字段,我可能会这样写一个 rspec:

describe Customer do
    it "saves & retrieves its fields to and from the db"

    c = Customer.new
    c.name = "Bob Smith"
    c.address = "123 some street"
    c.phone = "555-555-5555"
    or = Order.new
    c.orders << or

    c.save

    found = Customer.find(c.id)
    found.should_not be(c)
    found.name.should == c.name
    found.address.should == c.address
    found.phone.should == c.phone
    found.orders.count.should == 1
    found.orders[0].id.should == or.id

    end
end

这是“最佳实践”还是在 ruby​​/rails/rspec 世界中很常见?我还应该注意,重点不是测试 rails 本身在做什么,而是测试在数据库和模型中设置了正确的字段和关系。

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec tdd


    【解决方案1】:

    没有。您不应该单元测试持久性。单元测试验证单元独立工作,您应该只测试您的代码。持久化功能是 Rails 的一部分,因为它不是你的代码,所以你不应该为它编写单元测试。

    可能对测试映射感兴趣,但对单元测试不感兴趣。你会为此编写一个集成测试。集成测试将测试您的模块,与系统的另一部分集成,可能一直到数据库。运行这些测试将验证您的模块是否适用于数据库,即 映射 是否良好。

    简而言之 - 您不会在 单元 测试中测试持久性;你在集成测试中测试它们。

    【讨论】:

    • 我想我使用了错误的术语。我忘记了单元测试和集成测试之间的区别。所以在您看来,为这些类型的映射在 Rails 中创建集成测试是个好主意吗?常见吗?
    • 我必须承认我对 Rails 不是很熟悉,因为我在 .net 框架中拥有大部分经验,但是是的,它非常测试很常见带有集成测试的持久层。此外,从技术上讲,任何持久层测试都是集成测试,任何 SAT 测试都将包括持久性验证。
    • +1 用于解释何时合适,即使在 OP 描述的情况下不合适。
    【解决方案2】:

    不,我不认为进行这种较低级别的测试是最佳做法,因为这些测试中的大多数将内置到 Rails 和您正在使用的 ORM 的测试中。

    但是,如果您在模型中重写任何方法或执行复杂的关联逻辑,最好有自己的测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2016-03-07
      • 2012-10-22
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2022-06-15
      相关资源
      最近更新 更多