2012-02-27 41 views
0

我们在做RSpec 2的rails 3.2.1项目。我的问题是,我应该测试每个activerecord模型的基本持久性吗?我曾经在C#/ NHibernate的日子里这样做过,以确保正确的表/映射在那里。一个单元应该在rails中测试持久性吗?

所以,如果我有姓名,地址和电话领域的客户,我可能会写这样一个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本身在做什么,而是测试在db和模型中设置了正确的字段和关系。

回答

3

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

可以有兴趣在测试映射,但不是在一个单元测试。你会写一个集成测试。集成测试将测试您的模块,与系统的另一部分集成,或许一直到数据库。运行这些测试将验证你的模块是否可以与数据库一起工作,即映射是好的。

总之 - 你不测试持久性单元测试;你在集成测试中测试它们。

+0

我想我使用的是错误的术语。我忘记了单元测试和集成测试之间的区别。所以在你看来,在rails中为这些类型的映射创建集成测试是一个好主意吗?这是常见的吗? – fregas 2012-02-28 23:00:43

+0

我必须承认,我对Rails不是很熟悉,因为我在.net框架中拥有大部分经验,但是,对于使用集成测试来测试持久层是非常普遍的。此外,从技术上讲,任何持久层测试都将是集成测试,任何SAT测试都会包含持久性验证。 – 2012-03-01 07:57:21

+0

+1用于解释何时适用,即使它在OP描述的情况下不合适。 – 2014-09-08 04:17:27

3

不,我不认为这是一种最好的做法,做这种较低级别的测试,因为这些测试的大部分将被内置到Rails和您正在使用的ORM的测试中。但是,如果您重写模型中的任何方法或执行复杂的关联逻辑,最好是进行自己的测试。

相关问题