[rspec-users] Strange return value

Zhi-Qiang Lei zhiqiang.lei at gmail.com
Sat Oct 2 00:50:33 EDT 2010


On Oct 1, 2010, at 8:48 PM, David Chelimsky wrote:

> On Oct 1, 2010, at 6:11 AM, Zhi-Qiang Lei wrote:
> 
>> Dear All,
>> 
>> I meet a strange issue when I test my Rack Middleware. Could anyone help me to point the error out? Thanks.
>> 
>> This is the code.
>> 
>> class EIOUAuthorization
>> def initialize(app)
>>   @app = app
>> end
>> def call(env)
>>   request = Rack::Request.new(env)
>>   path_strings = request.path_info.split('/', 4)
>>   if path_strings[1] == 'people'
>>     user = User.get(path_strings[2])
>>     return not_found if user.nil?
>>     digest_authentication(user).call(env)
>>   else
>>     @app.call(env)
>>   end
>> end
>> #private
>> def not_found
>>   [404, {'Content-Type' => 'text/plain', 'Content-Length' => '0'}, []]
>> end
>> def digest_authentication(user)
>>   auth = Rack::Auth::Digest::MD5.new(@app, user.realm) do |email|
>>     {user.person.email => user.ha1}[email]
>>   end
>>   auth.passwords_hashed = true
>>   auth.opaque = 'opaque-for-' + user.realm
>>   auth
>> end
>> end
>> 
>> And this is my test case.
>> 
>> describe '#call' do
>>   it 'should call digest_authentication method with id when get /people/{person-id}' do
>>     app.should_receive(:digest_authentication).with(@user).once
>>     get "/people/#{@person.id}"
>>   end
>> end
>> 
>> describe '#digest_authentication' do
>>   it 'should respond to call' do
>>     app.digest_authentication(@user).should respond_to(:call)
>>   end
>> end
>> 
>>> From the result we can see the #digest_authentication is called, and the result should respond to call. But the fact is that it return a nil object in the code.
>> 
>> F.
>> 
>> 1)
>> NoMethodError in 'EIOUAuthorization#call should call digest_authentication method with id when get /people/{person-id}'
>> undefined method `call' for nil:NilClass
>> ./spec/../main.rb:21:in `call'
>> /Library/Ruby/Gems/1.8/gems/rack-test-0.5.4/lib/rack/mock_session.rb:30:in `request'
>> /Library/Ruby/Gems/1.8/gems/rack-test-0.5.4/lib/rack/test.rb:207:in `process_request'
>> /Library/Ruby/Gems/1.8/gems/rack-test-0.5.4/lib/rack/test.rb:57:in `get'
>> ./spec/eiou_authorization.rb:34:
>> 
>> Finished in 0.024267 seconds
>> 
>> 2 examples, 1 failure
> 
> 
> How are you initializing the app object?
> 
> _______________________________________________
> rspec-users mailing list
> rspec-users at rubyforge.org
> http://rubyforge.org/mailman/listinfo/rspec-users

As follow.

$:.unshift File.join(File.dirname(__FILE__), '..')

require 'main'
require 'rack/test'

describe EIOUAuthorization do

  include Rack::Test::Methods

  before :all do
    @person = Person.create(:email => 'zhiqiang.lei at gmail.com')
    @user = User.new
    @user.name = 'levin'
    @user.person = @person
    @user.password = 'password'
    @user.save
  end
 
  def unprotected_app
    lambda do |env|
      [200, {'Content-Type' => 'text/plain'}, ['Hello World!']]
    end
  end
  
  def protected_app
    @protected_app ||= EIOUAuthorization.new(unprotected_app)
  end

  alias :app :protected_app

  describe '#call' do
    it 'should call digest_authentication method with id when get /people/{person-id}' do
      app.should_receive(:digest_authentication).with(@user).once
      get "/people/#{@person.id}"
    end
  end

  describe '#digest_authentication' do
    it 'should respond to call' do
      app.digest_authentication(@user).should respond_to(:call)
    end
  end

  after :all do
    Person.all.destroy
    User.all.destroy
  end

end
  



More information about the rspec-users mailing list