невозможно получить доступ к переменной метода, которая находится в том же файле - PullRequest
0 голосов
/ 22 марта 2012

Я не могу использовать метод при перемещении фрагмента кода в другой файл.

Ниже приведенный код работает, поскольку весь код находится в одном файле.

require 'rubygems'
require 'watir'
require 'win32ole'
require 'erb' 
require 'ostruct' 
require 'C:/classes/html.class'
require 'C:/classes/Xls'
require 'C:/classes/screen_capture'
require 'C:/classes/RequiredRubies'
include Watir
begin

      xlFile = XLS.new(Dir.pwd + '/testdata.xls') 
      myData = xlFile.getRowRecords('a2:z3','Pit') 
      xlFile.close
      myData.each do |record| 

      @ie = IE.new 
      @ie.maximize
      @ie.goto (record['Url'])
      @ie.focus

end
end

InПриведенный выше код «URL» присутствует в именах листов Excel testdata.xls.Приведенный выше код работает просто отлично.Допустим, это имя файла file1.rb

Но я хочу переместить открытие браузера в другой файл, чтобы я не использовал этот код во всех тестовых файлах и использовал его только в одном файле и вызывалот этого ко всем другим испытаниям.Ниже приведено изменение, которое я сделал, но это не работает.

В File1.rb я сохранил

Все необходимые файлы + новый файл, в котором я упомянул общий код для открытия браузера.

require 'C:/function.rb

include Watir
include Commonfunctions

begin

      xlFile = XLS.new(Dir.pwd + '/testdata.xls') 
      myData = xlFile.getRowRecords('a2:z3','Pit') 
      xlFile.close
      myData.each do |record| 

   openie = openbrowser

end

end

И я создал файл для открытия браузера, который я хочу использовать в качестве обычной функции.Допустим, это имя файла указано в function.rb

Все необходимые файлы + код ниже

include Watir

module Commonfunctions


def openbrowser
      @ie = IE.new 
      @ie.maximize
      @ie.goto (record['Url'])
      @ie.focus
end

end

Теперь, когда я запускаю свой file1.rb, я получаю следующую ошибку

C:/function.rb:17:in `openbrowser': undefined local variable or method `reco
rd' for main:Object (NameError)
        from test.rb:23:in `block in <main>'
        from test.rb:21:in `each'
        from test.rb:21:in `<main>'

Объект записи записан в другом файле, который является моим диском данных.В этом файле это код, где присутствует запись метода

    numRecords = myRange.Rows.Count
    (0..numRecords-1).each do |i|
      record=[]
      areas.each do |area|
        record.concat(area[i])
      end
      #Clean up formatting
      record.collect! do |x|
        if x.is_a?(Float) and x % 1 == 0
           x.to_i.to_s
         else
          x.to_s.strip
        end
      end
      data << record
    end
    return data
  end

Может ли кто-нибудь помочь мне решить эту проблему.Я хочу переместить все общие функции в один файл и использовать эти функции во всех тестах вместо того, чтобы писать одни и те же функции во всех тестах.

1 Ответ

1 голос
/ 22 марта 2012

record - это переменная лексической области, определенная в аргументах вашего блока, которая начинается myData.each do |record|. Поскольку он имеет лексическую область видимости, на него нельзя ссылаться по имени вне контекста, в котором он объявлен, поэтому вы должны передать его методу, который вы сделали явно.

myData.each do |record| 
   openie = openbrowser record # pass it here
end

# and in the other file

def openbrowser record
      @ie = IE.new 
      @ie.maximize
      @ie.goto (record['Url'])
      @ie.focus
end

Кстати, в своем вопросе вы утверждаете, что «объект« запись »исходит из другого файла». Это не так, как я уже указывал, где в контексте вашей проблемы установлен record. Вы были сбиты с толку, потому что вы используете плохие родовые имена и не пишете небольшие блоки кода с ограниченной областью действия.

Я ценю, что вы работаете над рефакторингом, чтобы улучшить организацию кода. В ваших примерах кода есть еще много вещей, которые заслуживают некоторого внимания: некоторые стилистические (camelCaseNames, случайные отступы), некоторые структурные (без OO, императивные файловые скрипты), некоторые синтаксические ловушки (пробел между именем метода и первым паром аргументов), некоторые идиома (плохое владение перечислимыми методами). Вы можете пройтись по коду с опытным программистом ruby ​​и попросить указателей в обзоре кода.

...