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
Best regards,
Lei, Zhi-Qiang
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 failureHow are you initializing the app object?
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-usersAs 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