diff --git a/lib/webrat/rails.rb b/lib/webrat/rails.rb index f95d75c..c426ea6 100644 --- a/lib/webrat/rails.rb +++ b/lib/webrat/rails.rb @@ -37,6 +37,18 @@ module Webrat def response_code response.code.to_i end + + require 'active_record/base' + require 'action_controller/record_identifier' + include ActionController::RecordIdentifier + + def within(selector_or_instance, &block) + if selector_or_instance.is_a?(::ActiveRecord::Base) + super('#' + dom_id(selector_or_instance), &block) + else + super(selector_or_instance, &block) + end + end protected diff --git a/spec/webrat/rails/rails_session_spec.rb b/spec/webrat/rails/rails_session_spec.rb index 4729d9e..acc736d 100644 --- a/spec/webrat/rails/rails_session_spec.rb +++ b/spec/webrat/rails/rails_session_spec.rb @@ -82,4 +82,22 @@ describe Webrat::RailsSession do it "should provide a doc_root" do Webrat::RailsSession.new(mock("integration session")).should respond_to(:doc_root) end + + it "should accept an ActiveRecord argument to #within and translate to a selector using dom_id" do + body = <<-HTML + Edit +
+ Edit +
+ HTML + response = mock("response", :body => body) + integration_session = mock("integration session", :response => response) + rails_session = Webrat::RailsSession.new(integration_session) + integration_session.should_receive(:request_via_redirect).with(:get, "/page2", {}, nil) + person = mock(::ActiveRecord::Base, :id => 1, :is_a? => true, :model_name => 'person') + + rails_session.within(person) do + rails_session.click_link 'Edit' + end + end end \ No newline at end of file