2016-04-05 7 views
2

Я пишу тесты калабаша, используя Ruby 2.3.0, и мне не удается вызвать методы огурца из модуля.Вызов методов огурца из модуля

module A 
    module_function 
    def visible 
     wait_for_elements_exist("Some element query") 
    end 
end 

И:

Class B 
    include A 
end 

Когда я называю B.visible или определить это в B:

def visible 
    A::visible 
end 

И позвони B.visible, я получаю NoMethodError указанием wait_for_elements_exist в модуле А.

Я пробовал require 'calabash-cucumber/cucumber' в модуле и include Calabash::Cucumber в модуле. Это не сработало.

Я могу получить доступ ко всем методам огурца из других классов в моем проекте, и я потребовал огурец в моем env.rb, чтобы библиотека была загружена. Я хотел бы знать, как получить доступ к библиотечным функциям из модуля или как правильно включить в мои модули.

EDIT

Я попытался include Calabash::Cucumber::WaitHelpers

И include Calabash::Cucumber::Operations

Не работает. Я заменил include с расширением, и теперь я могу получить доступ к методам, но это не решит мою проблему.

Что мне нужно

AndroidModule < Calabash::Android::Operations

IosModule < Calabash::Cucumber::Operations

В этих модулях я определяю методы, которые отличаются между платформами.

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

Мне нужен доступ к ::Operations от ScreenModule, но он не найдет ни одного из этих методов.

Я не могу понять, почему я не могу использовать wait_for_elements_exist, даже если я включил ::Operations Moudle

ответ

1

Короткий ответ в том, что вы не включая правильный модуль в модуле.

include Calabash::Cucumber::WaitHelpers 

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

# features/steps/my_steps.rb 
module MyApp 
    module A 
    def visible(mark) 
     wait_for_element_exist("* marked:'mark'") 
    end 
    end 
end 

World(MyApp::A) # Add your module to the Cucumber World. 

Then(/^I touch next$/) do 
    visible("Next") 
    touch("* marked:'Next'") 
end 

Вы можете увидеть пример этого в CalSmoke project.

Так вы загружаете модули в огурец.

Основываясь на вашем комментарии, я вижу, что вы хотите использовать объектную модель страницы (POM).

У нас есть примеры того, как это сделать в x-platform-example repo и в Xamarin docs.

Вам нужно понять, что существует разница между тем, как загружается код ruby ​​и как выставлять методы для огурца.

Если вы новичок в ruby, я рекомендую эту книгу Metaprogramming in Ruby. Если вы новичок в Cucumber, я рекомендую эти ресурсы.

+0

Что я пытаюсь создать здесь, представляет собой модуль для методов страницы объектов, которые я могу использовать для Android и прошивки страниц, поэтому я могу делиться определениями шагов между обеими платформами. Например, шаг от меня будет: 'Тогда (/^я вижу экрана входа в систему $ /) сделать ... создать объект Логин страницу ... login_screen.visible login_screen.do_stuff' И я хотите создавать модули для таких методов, как 'visible' и' do_stuff', поэтому я могу включить модули в классы классов iOS и Android. Я получил эту работу, расширив 'Calabash :: Cucumber :: Operations' в модуле A, чтобы получить доступ к операциям. – Krumons

Смежные вопросы