hi all, i''m just trying to check a partial has been rendered, by using: response.template.should_receive(:render).with(:partial => "tasks/list") this passes, even if I put something bogus in the partial name, such as: response.template.should_receive(:render).with(:partial => "___tassdfsdfks/list") does anyone know why this doesn''t fail? is this the wrong way to simply check a partial is being rendered? am running this as a story step. thanks, steven
On Sat, May 3, 2008 at 4:08 PM, steven shingler <shingler at gmail.com> wrote:> hi all, > > i''m just trying to check a partial has been rendered, by using: > response.template.should_receive(:render).with(:partial => "tasks/list") > > this passes, even if I put something bogus in the partial name, such as: > response.template.should_receive(:render).with(:partial => > "___tassdfsdfks/list") > > does anyone know why this doesn''t fail? > is this the wrong way to simply check a partial is being rendered? > am running this as a story step.I''m not sure how this is working to begin with. Where is this expectation in the flow of the code? It would seem to need to be before the request since it''s a should_receive But then what''s response at this point? And what''s response.template? It''s the controller, not the template which receives the render call. You say that this is in a story step? I''ve got a hunch that the step is''nt actually matching and therfore not getting run, which would explain why the assertion never fails. If you''re doing this as a full stack rails integration story, I don''t believe that you''ve got access to the controller, and this level of specification doesn''t belong here but rather in a controller spec, where you might want to use expect_render instead of should_receive(:render) as well. -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/
Hi Rick, Thanks for your reply. You are right that this step is basically testing the basic actions of a controller, and is being run as part of a story_with_steps stack. The step itself is definitely being hit, because I have a: response.should have_tag(''li'', @title) ...in the same step, and that is working nicely. This step is called right after clicking an Update button, which is a standard rails scaffold and does a: redirect_to(@task) - this causes a partial to be rendered to the screen as part of my default layout, and I was hoping to be able to verify that the partial loaded. What would fit my brain better, would be: response.should render_partial("tasks/list") ...but that isn''t available :) I hope that is clearer - I am quite new to the world of rspec. If you can shed any more light that would be really great. Thanks, Steven On Sat, May 3, 2008 at 11:17 PM, Rick DeNatale <rick.denatale at gmail.com> wrote:> > On Sat, May 3, 2008 at 4:08 PM, steven shingler <shingler at gmail.com> wrote: > > hi all, > > > > i''m just trying to check a partial has been rendered, by using: > > response.template.should_receive(:render).with(:partial => "tasks/list") > > > > this passes, even if I put something bogus in the partial name, such as: > > response.template.should_receive(:render).with(:partial => > > "___tassdfsdfks/list") > > > > does anyone know why this doesn''t fail? > > is this the wrong way to simply check a partial is being rendered? > > am running this as a story step. > > I''m not sure how this is working to begin with. > > Where is this expectation in the flow of the code? It would seem to > need to be before the request since it''s a should_receive > But then what''s response at this point? > And what''s response.template? > > It''s the controller, not the template which receives the render call. > > You say that this is in a story step? I''ve got a hunch that the step > is''nt actually matching and therfore not getting run, which would > explain why the assertion never fails. > > If you''re doing this as a full stack rails integration story, I don''t > believe that you''ve got access to the controller, and this level of > specification doesn''t belong here but rather in a controller spec, > where you might want to use expect_render instead of > should_receive(:render) as well. > > -- > Rick DeNatale > > My blog on Ruby > http://talklikeaduck.denhaven2.com/ > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >
On Sun, May 4, 2008 at 10:16 AM, steven shingler <shingler at gmail.com> wrote:> Hi Rick, > Thanks for your reply. > You are right that this step is basically testing the basic actions of > a controller, and is being run as part of a story_with_steps stack. > The step itself is definitely being hit, because I have a: > response.should have_tag(''li'', @title) > ...in the same step, and that is working nicely. > > This step is called right after clicking an Update button, which is a > standard rails scaffold and does a: redirect_to(@task) - this causes a > partial to be rendered to the screen as part of my default layout, and > I was hoping to be able to verify that the partial loaded. > > What would fit my brain better, would be: > response.should render_partial("tasks/list")Except that responses don''t render anything, controllers do which result in the body of the response. Also even if this were controller.should render_partial... I can''t see how this would work, since it seems to involve backwards time travel. In a controller spec you use controller.expect_render(:partial => ...) BEFORE doing a get/post etc. It works like x.should_receive(:foo) it''s something which needs to be set up before something happens.> ...but that isn''t available :) > > I hope that is clearer - I am quite new to the world of rspec. > If you can shed any more light that would be really great.Rails integration testing happens in the context of a simulated browser. It''s awkward, if indeed it''s possible at all, to instrument the mechanisms of controllers and templates here. This is normally done in controller and/or view specs. At the story/integration level, I think you really want to be looking at the result of the http requests, which means you should be setting expectations about what''s in the response rather than how the response is going to be constructed. So instead of trying to determine if the tasks_list partial is being rendered, why not do something like having the partial generate evidence that it was invoked in the output, for example it might generate a div or ol or whatever which contains the tasks list which has a particular dom id, and then use response.should have_tag to verify that the task list is in the response? -- Rick DeNatale My blog on Ruby http://talklikeaduck.denhaven2.com/
Hi Rick - Thanks again. Cool - I see what you mean about what the story steps should get involved with, and what should be left to the specs. In that case, my response.should have_tag(''li'', @title) is a reasonable test, and I''ll leave it at that! All the best, Steven On Sun, May 4, 2008 at 3:36 PM, Rick DeNatale <rick.denatale at gmail.com> wrote:> On Sun, May 4, 2008 at 10:16 AM, steven shingler <shingler at gmail.com> wrote: > > Hi Rick, > > Thanks for your reply. > > You are right that this step is basically testing the basic actions of > > a controller, and is being run as part of a story_with_steps stack. > > The step itself is definitely being hit, because I have a: > > response.should have_tag(''li'', @title) > > ...in the same step, and that is working nicely. > > > > This step is called right after clicking an Update button, which is a > > standard rails scaffold and does a: redirect_to(@task) - this causes a > > partial to be rendered to the screen as part of my default layout, and > > I was hoping to be able to verify that the partial loaded. > > > > What would fit my brain better, would be: > > response.should render_partial("tasks/list") > > Except that responses don''t render anything, controllers do which > result in the body of the response. > > Also even if this were > > controller.should render_partial... > > I can''t see how this would work, since it seems to involve backwards > time travel. In a controller spec you use > > controller.expect_render(:partial => ...) > > BEFORE doing a get/post etc. It works like x.should_receive(:foo) > it''s something which needs to be set up before something happens. > > > > ...but that isn''t available :) > > > > I hope that is clearer - I am quite new to the world of rspec. > > If you can shed any more light that would be really great. > > Rails integration testing happens in the context of a simulated > browser. It''s awkward, if indeed it''s possible at all, to instrument > the mechanisms of controllers and templates here. This is normally > done in controller and/or view specs. > > At the story/integration level, I think you really want to be looking > at the result of the http requests, which means you should be setting > expectations about what''s in the response rather than how the response > is going to be constructed. > > So instead of trying to determine if the tasks_list partial is being > rendered, why not do something like having the partial generate > evidence that it was invoked in the output, for example it might > generate a div or ol or whatever which contains the tasks list which > has a particular dom id, and then use response.should have_tag to > verify that the task list is in the response? > > -- > > > Rick DeNatale > > My blog on Ruby > http://talklikeaduck.denhaven2.com/ > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >