Desacoplar testes de modelo de observadores

É uma notícia velha, mas você realmente deve desacoplar os testes do modelo dos observadores. Digamos, você tem um observador que faz algo não intimamente relacionado com o que o modelo faz, como enviar uma notificação por e-mail:

class UserObserver < ActiveRecord::Observer
def after_create(user)
Emailer.someone_signed_up(user).deliver
end
end

Uma especificação como esta acionaria o observador todas as vezes:

describe User do
it
"should create user with valid attributes" do
user
= User.new(email: 'user@me.com', name: 'user')
user
.save.should be_true
end
end

Isso falhará se o método de emailer falhar. Você não quer isso. Felizmente, há uma grande joia para o resgate (com um nome um tanto estranho): https://github.com/patmaddox/no-peeping-toms .

Agora, coloque isso no bloco Rspec.configure e pronto:

ActiveRecord::Observer.disable_observers

E se você realmente precisar ter esse observador ligado?

it "should notify founders when someone signs up" do
ActiveRecord::Observer.with_observers(:user_observer) do
User.create(email: 'user@me.com', name: 'user')
ActionMailer::Base.deliveries.should_not be_empty
end
end