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

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

Что мне не хватает?

Ответы [ 2 ]

0 голосов
/ 05 января 2012

Изменяя имена функций в модулях, я могу заставить их работать.

пример модуля:

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

Строка со стрелкой <--- является основным изменением (также пришлось изменить имя модуля, не было заглавной буквы ... упс) </p>

пример теста:

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
0 голосов
/ 04 января 2012

Вы пытались использовать Test / Unit / rSpec или что-то подобное для запуска ваших тестов?

Кроме того, я понимаю:

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

Рассматривали ли вы создание класса для ваших тестов, например, Test, а затем TestType1 и TestType2, наследуемых от этого родителя?class?

Например:

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

Который затем позволяет вам вызывать одно и то же имя метода и вести себя по-разному в зависимости от класса теста.

IЯ уверен, что есть более элегантные решения, я просто тестер, а не программист!:)

...