Good day! I have a Rails app with a controller that sets an instance variable in a before_filter, like this: class PostsController < ApplicationController before_filter :set_site_language def set_site_language @site_language = cookie[''lang''] ? Language.find_by_code(cookie[''lang'']) : Language.find(:first) end def index @posts = Post.find_by_language_id(@site_language.id) end end The controller has the following spec: describe PostsController do it "should show home page" do get :index response.should be_success end end And the equivalent test: class PostsControllerTest < ActionController::TestCase def test_should_show_home_page get :index assert_response :success end end The test runs fine, but the spec fails with the following error on line with `@posts = Post.find_by_language_id(@site_language.id)`: RuntimeError in ''PostsController should show home page'' Called id for nil, which would mistakenly be 4 -- if you really wanted the id of nil, use object_id Seems that @site_language does not get assigned when spec runs. Could you please help me solve this problem? Yours, Damian -- Posted via http://www.ruby-forum.com/.
On Jul 3, 2008, at 2:24 AM, Damian Terentiev wrote:> Good day! > > I have a Rails app with a controller that sets an instance variable > in a > before_filter, like this: > > class PostsController < ApplicationController > > before_filter :set_site_language > > def set_site_language > @site_language = cookie[''lang''] ? > Language.find_by_code(cookie[''lang'']) : > Language.find(:first)Shouldn''t this be cookies, not cookie? Doesn''t explain why the test passes when the example fails, but it seems that both should be raising errors on this.> > end > > def index > @posts = Post.find_by_language_id(@site_language.id) > end > > end > > The controller has the following spec: > > describe PostsController do > > it "should show home page" do > get :index > response.should be_success > end > > end > > And the equivalent test: > > class PostsControllerTest < ActionController::TestCase > > def test_should_show_home_page > get :index > assert_response :success > end > > end > > The test runs fine, but the spec fails with the following error on > line > with `@posts = Post.find_by_language_id(@site_language.id)`: > > RuntimeError in ''PostsController should show home page'' > Called id for nil, which would mistakenly be 4 -- if you really wanted > the id of nil, use object_id > > Seems that @site_language does not get assigned when spec runs. Could > you please help me solve this problem? > > Yours, > Damian > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
David Chelimsky wrote:> On Jul 3, 2008, at 2:24 AM, Damian Terentiev wrote: > >> def set_site_language >> @site_language = cookie[''lang''] ? >> Language.find_by_code(cookie[''lang'']) : >> Language.find(:first) > > Shouldn''t this be cookies, not cookie? Doesn''t explain why the test > passes when the example fails, but it seems that both should be > raising errors on this.Yes, there should be `cookies`, but the problem still exists. -- Posted via http://www.ruby-forum.com/.
I believe the problem is that you''re not telling the Language model what to stub/mock when it calls the find method inside of set_site_language. I''m not entirely sure, but I would imagine that the TestUnit test is passing, because it''s using the full Rails stack to run the test. Try doing something like this (code below): On Jul 3, 2008, at 2:24 AM, Damian Terentiev wrote:> Good day! > > I have a Rails app with a controller that sets an instance variable > in a > before_filter, like this: > > class PostsController < ApplicationController > > before_filter :set_site_language > > def set_site_language > @site_language = cookie[''lang''] ? > Language.find_by_code(cookie[''lang'']) : > Language.find(:first) > end > > def index > @posts = Post.find_by_language_id(@site_language.id) > end > > end > > The controller has the following spec: > > describe PostsController dobefore(:each) do @language_mock = mock_model(Language) controller.stub!(:set_site_language).and_return @language_mock end> > > it "should show home page" do > get :index > response.should be_success > end > > end > > And the equivalent test: > > class PostsControllerTest < ActionController::TestCase > > def test_should_show_home_page > get :index > assert_response :success > end > > end > > The test runs fine, but the spec fails with the following error on > line > with `@posts = Post.find_by_language_id(@site_language.id)`: > > RuntimeError in ''PostsController should show home page'' > Called id for nil, which would mistakenly be 4 -- if you really wanted > the id of nil, use object_id > > Seems that @site_language does not get assigned when spec runs. Could > you please help me solve this problem? > > Yours, > Damian > -- > Posted via http://www.ruby-forum.com/. > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users
Bryan Ray wrote:> I believe the problem is that you''re not telling the Language model > what to stub/mock when it calls the find method inside of > set_site_language. > > I''m not entirely sure, but I would imagine that the TestUnit test is > passing, because it''s using the full Rails stack to run the test. > > Try doing something like this (code below):Thanks for your help! Anyway, switching to Test::Spec has solved the problem. -- Posted via http://www.ruby-forum.com/.