Странные проблемы с открытием классов Ruby - PullRequest
2 голосов
/ 04 февраля 2011

Я работаю одновременно с Watir и Watir-WebDriver и пытаюсь сделать их более совместимыми, открыв некоторые классы и переопределив некоторые методы.Я столкнулся со странным поведением, которое не могу объяснить.Я пытаюсь понять, что происходит.

Это происходит с watir-1.7.1, который доступен только в Windows.
Ruby 1.8.7-p330
RUBYOPT = -rubygems

Тест 1.

require 'watir'

Watir::ElementCollections.class_eval do
  def new_method
  end
end

>ruby open-classes-watir1.rb
open-classes-watir1.rb:3: uninitialized constant Watir::ElementCollections (NameError)

Почему Руби жалуется на повторное открытие действительного класса?

Рассматриваемый класс выглядит так:

element_collections.rb:

module Watir
   #... 
  class ElementCollections
    include Enumerable
    #...
  end
end

Но это не все!Теперь посмотрите на это:

Тест 2.

require 'watir'

Watir::IE.class_eval do
end

Watir::ElementCollections.class_eval do # Requires the magic incantation above
  def new_method
  end
end

>ruby open-classes-watir2.rb

Теперь с этим заклинанием черной магии все в порядке.Watir :: IE выглядит так:

ie-class.rb:

module Watir
  class IE
    include WaitHelper
    include Exception
    include Container
    include PageContainer
    #...
  end
end

Почему?

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Некоторое время назад я оказал визуальную помощь.http://www.flickr.com/photos/marekj/3615299778/ Требуется, чтобы «watir» происходил из драгоценного камня обычного человека Требуется «watir / ie», происходящего из драгоценного камня watir.здесь играют две драгоценности.

1 голос
/ 04 февраля 2011

Это происходит потому, что require "watir" еще не загружается Watir::IE. Watir::IE загружается Kernel.autoload при выполнении Watir::Browser.new. Вот как это сделать:

require "watir"
Watir::IE # to trigger autoload

# now Watir::ElementCollections exists

Другое решение было бы require "watir/core", как предложил Стив.

1 голос
/ 04 февраля 2011

Я подозреваю, что файл lib/watir/element_collections.rb, который определяет Watir::ElementCollections, не загружается при вызове require 'watir'.lib/watir/ie.rb требуется lib/watir/core.rb, что, в свою очередь, требует lib/watir/element_collections.rb.

Попробуйте:

require 'watir'
require 'watir/core'

Watir::ElementCollections.class_eval do
  def new_method
  end
end
...