Hi,
I have been a bad TDD developer and developed before testing. My code is
working fine, but I have been writing tests because it is the right
thing to
do. I am running into trouble with some controller methods that are
saved in
a separate lib module and included in the application.rb file. I started
out
specing the methods from one of the controller specs and then when all
went
well I moved them into a separate file and made the description shared.
This
seemed to be working until I started testing a completely separate set
of
method. Here is the code:
The specs:
shared_member_restriction_spec.rb
describe “MemberRestriction”, :shared => true do
before(:each) do
params[:username] = “some_user”
params[:password] = “password”
request.request_uri = “members/” + controller.controller_name
end
describe “authenticate_if_in_members” do
it “should call authenticate_if_in_members” do
controller.should_receive(:authenticate_if_in_members)
get :index
end
it "should call authenticate_member" do
controller.should_receive(:authenticate_member)
get :index
end
end
end
episode_controller_spec.rb
require File.dirname(FILE) + ‘/shared_member_restriction_spec’
describe EpisodesController do
it_should_behave_like “MemberRestriction”
…
end
And the lib module:
module MemberRestriction
def authenticate_if_in_members
if request.request_uri.include? “members/”
authenticate_member
bounce_if_membership_not_in_collection
end
end
…
end
Finally the episode controller code:
class EpisodesController < ApplicationController
before_filter :authenticate_if_in_members
…
end
The spec “should call authenticate_member” is failing like so:
Spec::Mocks::MockExpectationError in ‘EpisodesController
authenticate_if_in_members should call authenticate_member’
Mock ‘EpisodesController’ expected :authenticate_member with (any args)
once, but received it 0 times
I thought maybe the problem was that really I hadn’t gotten these specs
setup correctly for sharing, so I tried moving them back into the
episode
controller spec. No luck. Then I thought that maybe this was a bug with
the
version of rspec/autotest. I upgraded them both yesterday to the most
recent
version.
I ran into a similar problem testing a different module. I had some
params
and a ruby statement that said something like
User.authenticate(params[:user], params[:password]) if params[:user] and
params[:password]
The error that I got said that params was nil and therefore nil.[]
wasn’t a
kosher ruby request. The if statement was redundant and so I took it
out, at
which point the params were not nil and everything worked according to
plan.
This was another situation where the code ran fine, but the tests were
coughing on an if statement.
I am honestly fuzzy about at what point rspec is setting the http head
variables, and how everything works, so please let me know if I am doing
something terribly or subtly wrong. I think it is my confusion about the
controller setup process that makes me avoid BDD when it comes to my
controllers, and delight in it when it comes to my models.
Thanks