OSDN Git Service

Disable observers in specs. Enable only when observer is under test.
authorRobb Kidd <robb@thekidds.org>
Tue, 12 Jun 2012 18:27:03 +0000 (14:27 -0400)
committerRobb Kidd <robb@thekidds.org>
Wed, 20 Jun 2012 18:09:46 +0000 (14:09 -0400)
Used the built-in observer enable/disable feature in ActiveModel[1].
ActiveRecord::Base includes ActiveModel::Observing which provides this
behavior.

Simple wraps to enable the observer under test were added to the specs
for: ActivityObserver, IssueObserver, Admin::Users and Issues.

The spec for Project.last_activity was refactored to separate the tests
for #last_activity and #last_activity_date. Each had doubles added to
isolate the spec from the hidden dependency on the ActivityObserver
action to create an Event for the project when an Issue is created. This
ActivityObserver behavior is already tested by its spec.

[1] http://api.rubyonrails.org/classes/ActiveModel/ObserverArray.html

spec/models/activity_observer_spec.rb
spec/models/issue_observer_spec.rb
spec/models/project_spec.rb
spec/requests/admin/admin_users_spec.rb
spec/requests/issues_spec.rb
spec/spec_helper.rb

index 91c7d91..aed1b26 100644 (file)
@@ -9,9 +9,11 @@ describe ActivityObserver do
   end
 
   describe "Merge Request created" do 
-    before do 
-      @merge_request = Factory :merge_request, :project => project
-      @event = Event.last
+    before do
+      MergeRequest.observers.enable :activity_observer do
+        @merge_request = Factory :merge_request, :project => project
+        @event = Event.last
+      end
     end
 
     it_should_be_valid_event
@@ -20,9 +22,11 @@ describe ActivityObserver do
   end
 
   describe "Issue created" do 
-    before do 
-      @issue = Factory :issue, :project => project
-      @event = Event.last
+    before do
+      Issue.observers.enable :activity_observer do
+        @issue = Factory :issue, :project => project
+        @event = Event.last
+      end
     end
 
     it_should_be_valid_event
index 42cf81c..b66803e 100644 (file)
@@ -13,7 +13,10 @@ describe IssueObserver do
 
     it 'is called when an issue is created' do
       subject.should_receive(:after_create)
-      Factory.create(:issue, :project => Factory.create(:project))
+
+      Issue.observers.enable :issue_observer do
+        Factory.create(:issue, :project => Factory.create(:project))
+      end
     end
 
     it 'sends an email to the assignee' do
@@ -40,8 +43,11 @@ describe IssueObserver do
     it 'is called when an issue is changed' do
       changed = Factory.create(:issue, :project => Factory.create(:project))
       subject.should_receive(:after_update)
-      changed.description = 'I changed'
-      changed.save
+
+      Issue.observers.enable :issue_observer do
+        changed.description = 'I changed'
+        changed.save
+      end
     end
 
     context 'a reassigned email' do
index 6285a85..d28668b 100644 (file)
@@ -72,16 +72,29 @@ describe Project do
   end
 
   describe "last_activity" do
-    let(:project) { Factory :project }
+    let(:project)    { Factory :project }
+    let(:last_event) { double }
 
     before do
-      @issue = Factory :issue, :project => project
+      project.stub(:events).and_return( [ double, double, last_event ] )
     end
 
-    it { project.last_activity.should == Event.last }
-    it { project.last_activity_date.to_s.should == Event.last.created_at.to_s }
+    it { project.last_activity.should == last_event }
   end
 
+  describe 'last_activity_date' do
+    let(:project)    { Factory :project }
+
+    it 'returns the creation date of the project\'s last event if present' do
+      last_event = double(:created_at => 'now')
+      project.stub(:events).and_return( [double, double, last_event] )
+      project.last_activity_date.should == last_event.created_at
+    end
+
+    it 'returns the project\'s last update date if it has no events' do
+      project.last_activity_date.should == project.updated_at
+    end
+  end
   describe "fresh commits" do
     let(:project) { Factory :project }
 
index c98ed2c..d9c3472 100644 (file)
@@ -40,19 +40,23 @@ describe "Admin::Users" do
     end
 
     it "should call send mail" do
-      Notify.should_receive(:new_user_email).and_return(stub(:deliver => true))
-      click_button "Save"
+      User.observers.enable :mailer_observer do
+        Notify.should_receive(:new_user_email).and_return(stub(:deliver => true))
+        click_button "Save"
+      end
     end
 
     it "should send valid email to user with email & password" do
-      with_resque do
-        click_button "Save"
+      User.observers.enable :mailer_observer do
+        with_resque do
+          click_button "Save"
+        end
+        user = User.last
+        email = ActionMailer::Base.deliveries.last
+        email.subject.should have_content("Account was created")
+        email.body.should have_content(user.email)
+        email.body.should have_content(@password)
       end
-      user = User.last
-      email = ActionMailer::Base.deliveries.last
-      email.subject.should have_content("Account was created")
-      email.body.should have_content(user.email)
-      email.body.should have_content(@password)
     end
   end
 
index aa43b99..2c8650a 100644 (file)
@@ -128,18 +128,22 @@ describe "Issues" do
         end
 
         it "should call send mail" do
-          Notify.should_receive(:new_issue_email).and_return(stub(:deliver => true))
-          click_button "Submit new issue"
+          Issue.observers.enable :issue_observer do
+            Notify.should_receive(:new_issue_email).and_return(stub(:deliver => true))
+            click_button "Submit new issue"
+          end
         end
 
         it "should send valid email to user" do
-          with_resque do
-            click_button "Submit new issue"
+          Issue.observers.enable :issue_observer do
+            with_resque do
+              click_button "Submit new issue"
+            end
+            issue = Issue.last
+            email = ActionMailer::Base.deliveries.last
+            email.subject.should have_content("New Issue was created")
+            email.body.should have_content(issue.title)
           end
-          issue = Issue.last
-          email = ActionMailer::Base.deliveries.last
-          email.subject.should have_content("New Issue was created")
-          email.body.should have_content(issue.title)
         end
 
       end
index 18b7854..5556798 100644 (file)
@@ -52,6 +52,7 @@ RSpec.configure do |config|
     DatabaseCleaner.start
 
     WebMock.disable_net_connect!(allow_localhost: true)
+    ActiveRecord::Base.observers.disable :all
   end
 
   config.after do