无法访问不在同一文件中的方法变量

时间:2012-03-22 14:54:42

标签: ruby methods include watir

当我将一段代码移动到另一个文件时,我无法使用方法。

下面提到的代码工作原因导致所有代码都在一个文件中。

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

在上面的代码中,“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>'

'record'对象来自不同的文件,这是我的数据驱动器。在该文件中,这是存在方法记录的代码

    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 个答案:

答案 0 :(得分:1)

record是一个词法范围的变量,在块的args中定义,从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
顺便说一句,在你的问题中,你说明了&#34;&#39;记录&#39;对象来自不同的文件&#34;。事实并非如此,因为我已经指出了问题背景中record的位置。你在这里感到困惑是因为你使用了不好的通用名称,而没有编写范围有限的小块代码。

我感谢您正在努力重构以改进代码组织。你的代码示例还有很多值得关注的东西:一些样式(camelCaseNames,随机缩进),一些结构(没有OO,命令式文件脚本),一些句法陷阱(方法名称和args的第一个空格之间的空格),一些成语(可枚举方法的命令不佳)。您可以通过使用经验丰富的ruby程序员遍历代码并在代码审查中寻求指导来获益。