I''m really, really confused about the use of instance variables in my
controller and their relationship to my controller spec.
I''m trying to spec a controller that has a before_filter
:require_member
(it''s Authlogic and set up in ApplicationController. It in turn calls
current_member - which returns/creates the @member variable ) and a
before_filter :find_product
The find_product method is thus ...
def find_product
@product = (params[:id]) ? @member.products.find(params[:id]) :
Product.new
end
No matter what I try and in what order, I get the error message ....
NoMethodError in ''ProductsController PUT edit Product cut-off has
passed
creates a product object''
undefined method `products'' for nil:NilClass
and it points to the find_product method and it''s the @member that is
nil
I thought that the controller.stub(:require_member).and_return(member) would
suffice for the require_member stuff but I''m obviously wrong.
I''ve even
replaced the member for @member in my spec but to no avail.
Here''s the describe example ....
describe "PUT edit" do
context "Product cut-off has passed" do
let(:member) { mock_model(Member).as_null_object }
let(:product) { mock_model(Product).as_null_object }
## I just want it to create a @product object from
it "creates a product object" do
controller.stub(:require_member).and_return(member)
member.should_receive(:products)
get :edit, :id => "1"
end
end
end
If anyone would be able to untangle me, I''d be greatly appreciative.
CIA
-ants
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://rubyforge.org/pipermail/rspec-users/attachments/20110107/8c6bc57d/attachment.html>
Hi, On Sat, Jan 8, 2011 at 01:58, Ants Pants <antsmailinglist at gmail.com> wrote:> I thought that the?controller.stub(:require_member).and_return(member) would > suffice for the require_member stuff but I''m obviously wrong. I''ve even > replaced the member for @member in my spec but to no avail. > Here''s the describe example .... > ??describe "PUT edit" do > ?? ?context "Product cut-off has passed" do > ?? ? ?let(:member) { mock_model(Member).as_null_object } > ?? ? ?let(:product) { mock_model(Product).as_null_object } > ?? ? ?## I just want it to create a @product object from > ?? ? ?it "creates a product object" do > ?? ? ? ?controller.stub(:require_member).and_return(member) > ?? ? ? ?member.should_receive(:products) > ?? ? ? ?get :edit, :id => "1" > ?? ? ?end > ?? ?end > ??end > If anyone would be able to untangle me, I''d be greatly appreciative.Your stub returns member, but require_member sets the @member instance variable. Try modifying your stub to something like this (untested): controller.stub(:require_member) { assigns(:member) = member } HTH, Mike
Thanks for the reply but I''ve sorted it. I implemented this http://iain.nl/2008/11/authlogic-is-awesome/ <http://iain.nl/2008/11/authlogic-is-awesome/>I think the instance variables in this example replicate how they will look in the actual controller (thus enabling me to stub them/set message expectations. Anyway, I eventually got it working and can now press on. Again, thanks for taking the time to reply. On 8 January 2011 03:40, Mike Mazur <mmazur at gmail.com> wrote:> Hi, > > On Sat, Jan 8, 2011 at 01:58, Ants Pants <antsmailinglist at gmail.com> > wrote: > > I thought that the controller.stub(:require_member).and_return(member) > would > > suffice for the require_member stuff but I''m obviously wrong. I''ve even > > replaced the member for @member in my spec but to no avail. > > Here''s the describe example .... > > describe "PUT edit" do > > context "Product cut-off has passed" do > > let(:member) { mock_model(Member).as_null_object } > > let(:product) { mock_model(Product).as_null_object } > > ## I just want it to create a @product object from > > it "creates a product object" do > > controller.stub(:require_member).and_return(member) > > member.should_receive(:products) > > get :edit, :id => "1" > > end > > end > > end > > If anyone would be able to untangle me, I''d be greatly appreciative. > > Your stub returns member, but require_member sets the @member instance > variable. Try modifying your stub to something like this (untested): > > controller.stub(:require_member) { assigns(:member) = member } > > HTH, > Mike > _______________________________________________ > rspec-users mailing list > rspec-users at rubyforge.org > http://rubyforge.org/mailman/listinfo/rspec-users >-------------- next part -------------- An HTML attachment was scrubbed... URL: <http://rubyforge.org/pipermail/rspec-users/attachments/20110109/2237032b/attachment-0001.html>