appfolio / ae_page_objects

Page Objects for Capybara
MIT License
28 stars 9 forks source link

Reimplement proxy code of ElementProxy to be less severe #127

Open dtognazzini opened 9 years ago

dtognazzini commented 9 years ago

ElementProxy undefs a bunch of standard methods on objects:

# Remove all instance methods so even things like class()
# get handled by method_missing(). <lifted from activerecord>
instance_methods.each do |m|
  unless m.to_s =~ /^(?:nil\?|send|object_id|to_a|tap)$|^__|^respond_to/
    undef_method m
  end
end

This undefing is too severe and can cause issues when methods common to most objects are not available. #123 describes an issue with RSpec expectations. Additionally, inspecting instances of ElementProxy in debuggers like Rubymine can sometimes crash the debugger.

Reimplement the proxy code in ElementProxy to be less severe.

Some ideas:

  1. Use SimpleDelegator.
  2. Don't undef any methods.
dtognazzini commented 9 years ago

Another idea here would be to collapse the ElementProxy behavior into Element whereby the internal node attribute would function as the "implicit_element" of ElementProxy.

This would mean that callers would get references to instances of Element subclasses, making is_a? checks easier, but also changing the contract of methods generated by the element DSL.

It's unclear if this change would require a major version bump.

jacob-carlborg commented 9 years ago

It's unclear if this change would require a major version bump.

Technically removing ElementProxy is a breaking change, which would require a majort version bump. Although, I'm not sure if it was possible to know that ElementProxy actually existed, without looking in the source code