Our preferred way of testing ActiveRecord is to simply create/update/destroy the record and then check if the expected behavior has happened.
We used to bend over backwards to avoid touching the database for this. For this we used a lot of stubbing and tricks like
it_should_run_callbacks
Show archive.org snapshot
.
Today we would rather make a few database queries than have a fragile test full of stubs.
Example
Let's say your User
model creates a first Project
on creation, so the user doesn't see a blank application slate on her first visit:
class User < ActiveRecord::Base
has_many :projects
after_create :create_first_project
private
def create_first_project
projects.create!(name: 'My first project')
end
end
Note
Avoid having callbacks like this in your core
User
model. Prefer to use a form model Show archive.org snapshot likeUser::RegistrationForm
. Read our book Growing Rails Applications in Practice Show archive.org snapshot for details.
Here is a test for the User
model that automatically creates a Project
:
describe 'User' do
describe '#save' do
it "creates a first project for the user" do
user = FactoryBot.create(:user)
user.projects.size.should == 1
user.projects[0].name.should == 'My first project'
end
end
end