Я работаю над программой на Ruby с Watir, которая имеет серию модулей.
Пример модуля будет выглядеть так:
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()
. Однако для этого потребуется, чтобы у каждого модуля были совершенно уникальные имена, и это не лучшее решение.
Что мне не хватает?