fregas
fregas

Reputation: 3250

Should one unit test persistence in rails?

We're doing a rails 3.2.1 project with RSpec 2. My question is, should i be testing the basic persistence of each of my activerecord models? I used to do this in my C# / NHibernate days, to ensure the correct tables/mappings were there.

So if i have a customer with name, address and phone fields, I might write an rspec like this:

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

Is this "best practice" or common in the ruby/rails/rspec world? I should also note that the point is not to test what rails is doing natively, but instead test that the correct fields and relationships are setup in the db and models.

Upvotes: 0

Views: 884

Answers (2)

Assaf Stone
Assaf Stone

Reputation: 6317

No. You shouldn't be unit testing the persistence. A unit test validates the unit works in isolation, and you should only test your code. The persistence functionality is a part of Rails, and since it is not your code, you shouldn't write unit tests for it.

You could be interested in testing the mappings, but not in a unit test. You would write an integration test for that. An integration test would test your module, integrating with another part of the system, perhaps all the way to the database. Running those tests would validate that your module works with the database, i.e. the mappings are good.

In short - you don't test persistence in unit tests; you test them in integration tests.

Upvotes: 3

Justin Herrick
Justin Herrick

Reputation: 3011

No, I don't believe it is a best practice to do this sort of lower level testing as the majority of these tests would be built into to the testing for Rails and the ORM you are using.

However, if you are overriding any methods or performing complex association logic in your models it'd be best to have your own tests.

Upvotes: 3

Related Questions