So, after spending a little time trying to work with "and_yield", I
strongly believe that:
- Either I haven't understood what "and_yield" does
- And this is more than possible
- Or "and_yield" is not the toy I should be playing with.
What I'm trying to accomplish is to writing tests for the following code
(refactored after great advices from ///ark):
def create
authenticate_with_open_id(params[:identity_url], :required => [
:nickname, :email ], :optional => :fullname) do |result, identity_url,
registration|
if result.successful?
@user = User.create_with_role(:operator, identity_url,
registration)
redirect_to users_path
else
redirect_to new_user_path
end
end
end
I believe I should test that "authenticate_with_open_id" gets called on
@controller, and that
"create_with_role" gets called on "User" class.
So I wrote this:
def do_verb(options = { :identity_url => @identity_url })
post :create, options
end
it "should create a new user using OpenID authentication" do
@user = create_operator_user
@controller.should_receive(:authenticate_with_open_id)
User.should_receive(:create_with_role).and_return(@user)
do_verb
response.should redirect_to(users_path)
end
The test works up to the point where I set expectations on
":authenticate_with_open_id", then
it fails with:
Mock 'Class' expected :create_with_role with (any args) once, but
received it 0 times
I tried this:
@controller.should_receive(:authenticate_with_open_id).and_yield do
|a,b,c|
User.should_receive(:create_with_role).and_return(@user)
end
and this:
@controller.should_receive(:authenticate_with_open_id).and_yield
User.should_receive(:create_with_role).and_return(@user)
Both leading to the following error:
Mock 'UsersController' yielded || to block with arity of 3
Where am I doing wrong?
Thanks in advance for your help,
Carmine that really can't wrap his mind around RSpec :/
--
Posted via http://www.ruby-forum.com/.