简体   繁体   中英

How can I pass a hash into a class_eval'ed method with Ruby 1.8.7?

I'm trying to mock the OpenID handling in my cucumber tests. For this purpose I use the following method:

def set_result_of_openid_authentication(result_type, profile_data = nil)
  ActionController::Base.class_eval "
    def begin_open_id_authentication(identity_url, options = {})
      yield [OpenIdAuthentication::Result.new('#{result_type}'.to_sym), identity_url, #{profile_data}]
    end
  "
end

# example usage
set_result_of_openid_authentication :successful, 'email' => 'dhofstet@example.com'

This works fine with Ruby 1.9.2, but with Ruby 1.8.7 I get the following compile error:

(eval):5:in `set_result_of_openid_authentication': compile error
(eval):3: syntax error, unexpected tIVAR, expecting kDO or '{' or    '('    
...identity_url, emaildhofstet@example.com]

For some reason the hash is not preserved... Is there some workaround to make it work with both Rubies?

Thanks.

It looks like the problem is that inside your class_eval the interpolated string #{profile_data} is coming through as emaildhofstet@example.com which is the to_s representation of a Hash in 1.8.7.

If you replace this with #{profile_data.inspect} then it should come come through as {'email' => 'dhofstet@example.com'} as required.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM