# Unit testing an Observer

**URL:** <https://www.ruby-forum.com/t/unit-testing-an-observer/167966>\
**Category:** Rails\
**Created:** [May 14, 2009, 2:55pm UTC](https://www.ruby-forum.com/t/unit-testing-an-observer/167966 "2009-05-14T14:55:08Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![fipa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fipa](https://www.ruby-forum.com/u/fipa)\
**Post date:** [May 14, 2009, 2:55pm UTC](https://www.ruby-forum.com/t/unit-testing-an-observer/167966/1 "2009-05-14T14:55:08Z")

</div>

Hi,

How can I unit test an Observer? Its new method is private, and I can’t  
find any documentation on that topic.

---

<div class="post-metadata">

**Author:** ![fipa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fipa](https://www.ruby-forum.com/u/fipa)\
**Post date:** [May 14, 2009, 3:19pm UTC](https://www.ruby-forum.com/t/unit-testing-an-observer/167966/2 "2009-05-14T15:19:52Z")

</div>

Fernando P. wrote:

> How can I unit test an Observer? Its new method is private, and I can’t  
> find any documentation on that topic.

Can’t you trigger the observed event - such as Frob.create - and then  
detect the  
side-effect the observer produces?

–  
Phlip  
[http://flea.sourceforge.net/resume.html](http://flea.sourceforge.net/resume.html)

---

<div class="post-metadata">

**Author:** ![fipa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fipa](https://www.ruby-forum.com/u/fipa)\
**Post date:** [May 14, 2009, 5:09pm UTC](https://www.ruby-forum.com/t/unit-testing-an-observer/167966/3 "2009-05-14T17:09:29Z")

</div>

Here’s part of a spec (with some details changed/omitted) for an  
observer  
that notifies another system via a SOAP API that a user was created:

describe UserObserver do

before(:each) do  
@observer = UserObserver.instance  
end

it “sends notification of creation” do  
user = mock\_model(User, :email\_address =\> “removed\_email\_address@domain.invalid”, …)  
expected\_attributes = {  
:id =\> user.id,  
:“email-address” =\> user.email\_address,  
…  
}  
SomeApi.should\_receive(:user\_created).with(:attributes =\>  
expected\_attributes).and\_return(“created”)  
@observer.after\_create(user)  
end  
end

When testing your model that this observer observes, you might want to  
use  
the no peeping toms plugin [  
[http://github.com/pat-maddox/no-peeping-toms/tree/master](http://github.com/pat-maddox/no-peeping-toms/tree/master) ] to prevent  
observers from being notified.

Regards,  
Craig

–  
Craig D.  
Mutually Human Software

> **[Homepage | Mutually Human](https://www.mutuallyhuman.com/)**
>
> Technology Made for Humans by humans Data Analytics Data Analytics Data has become a critical part of business for most organizations. We work with you to ensure you have confidence in your data, can properly access it, and present it in a way that...

---

<div class="post-metadata">

**Author:** ![fipa](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/f/9e8a1a/32.png) [@fipa](https://www.ruby-forum.com/u/fipa)\
**Post date:** [May 14, 2009, 7:18pm UTC](https://www.ruby-forum.com/t/unit-testing-an-observer/167966/4 "2009-05-14T19:18:44Z")

</div>

> @observer = UserObserver.instance

Thanks Craig that was the trick!

I don’t need NoPeepingTom as I put expectations on observer’s method  
calls so I can intercept them and just make sure that the correct  
methods are invoked.
