0

私はこれについて本当に混乱しています。自動テストスイートで以下のRubyクラスを使用しています。

class FlightSearchPage

  attr_accessor :page_title

  def initialize(browser, page)
    @browser      = browser
    @start_url    = page
  end

  def method_missing(sym, *args, &block)
    @browser.send sym, *args, &block
  end

  @page_title   = @browser.title

  #def page_title
  #  @browser.title
  #end

end

私はそれを次のようにサブクラス化しています:

class BrandFlightsPage < FlightSearchPage


    def initialize(browser, page, brand)
      super(browser, page)
      [...snip...]
    end
end

サブクラスをインスタンス化して、watir-webdriverオブジェクトである@ browserを渡すと、@browser.titleは次のようにスローします。

nil:NilClassの未定義のメソッド `title'(NoMethodError)

しかし、FlightSearchPageのpage_titleメソッドのコメントを外すと、期待どおりに機能します。コンストラクター内の変数代入でも試してみました。

私はこれを追跡しようと円を描いて回っていますが、私はそれを見ることができません。

スタックトレースは次のとおりです。

undefined method `title' for nil:NilClass (NoMethodError)
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/flight_search_page.rb:13:in `<class:FlightSearchPage>'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/flight_search_page.rb:1:in `<top (required)>'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/pages/brand_flight_search_page.rb:1:in `<top (required)>'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/usr/local/rvm/rubies/ruby-1.9.3-p0/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:55:in `require'
/Users/Dazzla/Dropbox/src/Projects/over_the_watir/features/step_definitions/steps.rb:1:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_support/rb_language.rb:129:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/rb_support/rb_language.rb:129:in `load_code_file'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:171:in `load_file'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:83:in `block in load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in `each'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime/support_code.rb:82:in `load_files!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:175:in `load_step_definitions'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/runtime.rb:40:in `run!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:43:in `execute!'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/lib/cucumber/cli/main.rb:20:in `execute'
/usr/local/rvm/gems/ruby-1.9.3-p0/gems/cucumber-1.2.1/bin/cucumber:14:in `<top (required)>'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in `load'
/usr/local/rvm/gems/ruby-1.9.3-p0/bin/cucumber:19:in `<main>'
4

1 に答える 1

0

それの訳は

 attr_accessor :page_title

すでにゲッターセッターを作成しています。

私はこれを置きます

@page_title   = @browser.title

initializeメソッド内。

class FlightSearchPage

  attr_accessor :page_title

  def initialize(browser, page)
    @browser      = browser
    @page_title   = @browser.title
    @start_url    = page
  end

  def method_missing(sym, *args, &block)
    @browser.send sym, *args, &block
  end

end

または(より良い)attr_accessorを削除し、メソッドを追加するだけです

   class FlightSearchPage

      def initialize(browser, page)
        @browser      = browser
        @start_url    = page
      end

      def method_missing(sym, *args, &block)
        @browser.send sym, *args, &block
      end

      def page_title
        return @browser.title unless @browser
        "browser not set, no title"
      end

    end

ブラウザのインス​​タンス化:

これは、各テストの前に実行されるenv.rbというファイルに配置されます。

Before do
  @browser = Watir::Browser.new
end

これは、キュウリの世界の現在のインスタンスのコンテキストで実行されます

私が理解していないのは、これを除いて、アクセサーを使用して実装した場合、他のすべてのブラウザーメソッドが期待どおりに機能していることです。

于 2012-08-21T20:47:18.380 に答える