I would like to test that a Rails controller I am writing deletes all
NewsRelease objects and recreates them from an RSS feed. The new class_spy
feature seemed like a good way to test that my controller action is calling
the expected methods. But I can't seem to make it work - in context or even
when I try to call the methods directly in the example (see final example
below). I also tried the class_double("NewsRelease").as_null_object and got
the same message. What am I doing wrong?
/app/controller/news_configuration_controller.rb
class NewsConfigurationController < ApplicationController
# GET /news_configuration/refresh_from_www
def refresh_from_www
NewsRelease.delete_all
redirect_to news_configuration_path
end
end
/spec/controller/news_configuration_controller_spec.rb
RSpec.describe NewsConfigurationController, :type => :controller do
describe "GET 'refresh_from_www'" do
it "refreshes news releases" do
news_release_class = class_spy("NewsRelease")
get :refresh_from_www, { }, valid_session
expect(news_release_class).to have_received(:delete_all)
end
it "redirects to the news configuration index page" do
get :refresh_from_www, {}, valid_session
expect(response).to redirect_to(news_configuration_path)
end
it "deletes news releases - method called in the spec" do
release = FactoryGirl.create(:news_release)
puts "News release is: "
puts release.inspect
news_release_class = class_spy("NewsRelease")
puts "The class spy is: "
puts news_release_class.inspect
# get :refresh_from_www, { }, valid_session
items_deleted = NewsRelease.delete_all
puts "Deleted #{items_deleted} releases"
expect(news_release_class).to have_received(:delete_all)
end
end
end
$ rspec -f doc spec/controllers/news_configuration_controller_spec.rb:60
Run options: include
{:locations=>{"./spec/controllers/news_configuration_controller_spec.rb"=>[60]}}
NewsConfigurationController
GET 'refresh_from_www'
refreshes news releases (FAILED - 1)
redirects to the news configuration index page
News release is:
#<NewsRelease id: 2011, title: "News Story", link:
"http://www.caltech.edu", description: "Short blub", pubDate: "2014-08-24
23:17:28", guid: 1, created_at: "2014-09-07 23:17:28", updated_at:
"2014-09-07 23:17:28">
The class spy is:
#<RSpec::Mocks::ClassVerifyingDouble:0x98c1c58 @name="NewsRelease">
Deleted 1 releases
deletes news releases - method called in the spec (FAILED - 2)
Failures:
1) NewsConfigurationController GET 'refresh_from_www' refreshes news
releases
Failure/Error: expect(news_release_class).to have_received(:delete_all)
(Double "NewsRelease").delete_all(any args)
expected: 1 time with any arguments
received: 0 times with any arguments
# ./spec/controllers/news_configuration_controller_spec.rb:64:in
`block (3 levels) in <top (required)>'
2) NewsConfigurationController GET 'refresh_from_www' deletes news
releases - method called in the spec
Failure/Error: expect(news_release_class).to have_received(:delete_all)
(Double "NewsRelease").delete_all(any args)
expected: 1 time with any arguments
received: 0 times with any arguments
# ./spec/controllers/news_configuration_controller_spec.rb:82:in
`block (3 levels) in <top (required)>'
Finished in 0.21353 seconds (files took 2.94 seconds to load)
3 examples, 2 failures
Failed examples:
rspec ./spec/controllers/news_configuration_controller_spec.rb:61 #
NewsConfigurationController GET 'refresh_from_www' refreshes news releases
rspec ./spec/controllers/news_configuration_controller_spec.rb:72 #
NewsConfigurationController GET 'refresh_from_www' deletes news releases -
method called in the spec
Gemflie.lock ......
rspec-core (3.1.1)
rspec-expectations (3.1.0)
rspec-mocks (3.1.0)
rspec-rails (3.1.0)
--
You received this message because you are subscribed to the Google Groups
"rspec" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/rspec/121297c5-1422-4420-add1-4546073a2b10%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.