/no-peeping-toms

Disables observers during testing, allowing you to write model tests that are completely decoupled from the observer. Also lets you enable observers for a certain block of code, so that you can write observer tests

Primary LanguageRuby

no_peeping_toms

This plugin disables observers in your specs, so that model specs can run in complete isolation.

Installation

Add to your Gemfile:

gem 'no_peeping_toms', :git => 'git://github.com/alindeman/no_peeping_toms.git'

and run ‘bundle install`.

no_peeping_toms >= 2.0.0 only supports on Rails 3. If you need Rails 2 support, use 1.1.0: ‘gem install no_peeping_toms -v 1.1.0`

Usage

To disable observers, place the following code in your test.rb, or spec_helper.rb, or wherever:

ActiveRecord::Observer.disable_observers

You can easily reenable observers:

ActiveRecord::Observer.enable_observers

You can choose to run some code with specific observers turned on. This is useful when spec’ing an observer. For example, if you write the following observer:

class PersonObserver < ActiveRecord::Observer
  def before_update(person)
    old_person = Person.find person.id
    if old_person.name != person.name
      NameChange.create! :person => person, :old_name => old_person.name, :new_name => person.name
    end
  end
end

You can spec the Person class in complete isolation.

describe Person, " when changing a name" do
  before(:each) do
    @person = Person.create! :name => "Pat Maddox"
  end

  # By default, don't run any observers
  it "should not register a name change" do
    lambda { @person.update_attribute :name, "Don Juan Demarco" }.should_not change(NameChange, :count)
  end

  # Run only a portion of code with certain observers turned on
  it "should register a name change with the person observer turned on" do
    ActiveRecord::Observer.with_observers(:person_observer) do
      lambda { @person.update_attribute :name, "Don Juan Demarco" }.should change(NameChange, :count).by(1)
    end

    lambda { @person.update_attribute :name, "Man Without a Name" }.should_not change(NameChange, :count)
  end
end

Credits

  • Brandon Keepers

  • Corey Haines

  • Drew Olson

  • Jeff Siegel

  • Zach Dennis

  • Andy Lindeman

  • Ryan McGeary

Copyright © 2007-2011 Pat Maddox, released under the MIT license.