无法通过范围运算符访问模块中的函数

时间:2012-01-04 16:12:51

标签: ruby watir

我正在使用Watir开发一个带有一系列模块的Ruby程序。

示例模块如下所示:

demoMod1.rb

DEMOMOD1 = true #this module has been loaded
module demoMod1
  def reload(browser)
    browser.goto("demo1.html")
  end
end

有几个文件具有非常相似的命名功能(例如:reload()),因此demoMod2和demoMod3都具有相同的重载功能(除了指向不同的页面)。

当预计不会测试该区域时,模块会从需求列表中注释掉。 (根据设计规格)

然后程序动态加载测试用例文件(代码将在main.rb中执行)。每个测试用例文件都包含一个runTest()函数,该函数从模块中调用相应的部分。每个测试都会检查模块是否已加载,如果已加载,则执行测试。

示例测试用例文件如下所示:

test1.rb

def runTest(browser)  # test case 1
  if(defined?(DEMOMOD1)).nil?
    return nil  #if the module is not there, dont run this test
  end
  demoMod1::reload(browser)
end

根据规范,单个文件列出了所需的所有模块,因此用户只需注释掉不需要测试的部分而无需查看主文件。主要文件如下。

main.rb的

require 'Watir'
SITE = #internal site - address removed =/ sorry
FOLDER = File.dirname(__FILE__) + '/lib'
SHORTNAME = 'Test'  #for reporting
LONGNAME = 'In Development'  #for reporting
  #I know - globals.. yuck... avoid... 
require FOLDER + '/lib/requires'
  #includes the function to require each module from the module folder
require FOLDER + '/www/include/report.module'
  #creates an html report to view the test results

# Get list of tests
def getTests()
  Dir.chdir(FOLDER + '/Tests')
  files = Dir.glob("*.rb")
  return files
end #eofunc

# Run each test
def runTests(files, browser, report)
  testSuite = String.new
  files.each do |test|
    suite = test.split(" - ") # name convention:  suite - testname.rb
    if !(suite[0]==testSuite)
      testSuite = suite[0]
      report.newTestSuiteName(testSuite)
    end #eoif
    load FOLDER + '/Tests/' + test #load the test case file
    runTest(browser) #run the test case
  end #eoeach
end #eofunc

begin
  browser = Watir::Browser.new
  browser.goto(SITE)
  report = Report.new()
  reportname = report.createReport(SHORTNAME, LONGNAME) #vars in Vars.rb
  files = getTests()
  runTests(files, browser, report)
  report.finishReport(reportname, SITE)
  browser.close
  report.openReport(reportname) #launch report in a new browser
end #eofunc

我希望每个runTest()能够访问demoMod1::reload()demoMod2::reload(),但事实并非如此。我收到了undefined method 'reload' for demoMod1:Module的错误消息。我可以使用include demoMod1解决错误,但之后(如果我有正确的话),则不需要范围,只使用reload()就行了。但是,这需要每个模块都有完全唯一的名称,这不是一个很好的解决方案。

我错过了什么?

2 个答案:

答案 0 :(得分:0)

您是否尝试使用Test / Unit / rSpec或类似的东西来运行测试?

除此之外,我的理解是:

要求模块所在的文件仅使其可用。您需要使用include将其放入类中才能使用它。

您是否考虑过为您的考试准备课程,例如Test然后TestType1TestType2从该父类继承?

例如:

require fileWithYourModules

class Test
# stuff I want to have available to all tests
end

class TestSubType1 < Test
include demoMod1
end

class TestSubType2 < Test
include demoMod2
end

然后,它允许您调用相同的方法名称,并根据其具有的测试类使其行为不同。

我确信有更优雅的解决方案,我只是一个测试人员而不是程序员! :)

答案 1 :(得分:0)

通过更改模块中的函数名称,我可以使其工作。

示例模块:

DEMOMOD1 = true
module DemoMod1
  def DemoMod1.reload(browser) #<---------
    browser.goto('demo1.htm')
  end
end

与&lt; ---箭头的线是主要变化(也必须更改模块名称,没有首都首字母... oops)

示例测试用例:

def runTest(browser)  # test case 1
  if(defined?(DEMOMOD1)).nil?
    return nil  #if the module is not there, dont run this test
  end
  DemoMod1::reload(browser)
  ### OR ###   Both work
  DemoMod1.reload(browser)
end