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/.