一个单元应该测试轨道中的持久性吗?

时间:2012-02-27 21:42:03

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

我们正在使用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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

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

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

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