Можно ли использовать функцию страницы внутри класса?

#ruby #calabash #calabash-ios

#ruby #calabash #calabash-ios

Вопрос:

Я пишу несколько тестов в calabash и пытаюсь использовать функцию страницы внутри вспомогательного класса.

У меня есть файл моих шагов

 Given /^I am on my page$/ do
   mypage = page(MyPage)
   MyPageHelper.DoMultiActionStep()
end
  

И мой файл подкачки

 class MyPage < Calabash::ABase
    def my_element_exists
       element_exists(MY_ELEMENT_QUERY)
    end
end
  

И мой вспомогательный файл

 class MyPageHelper
   def self.DoMultiActionStep
      mypage = page(MyPage) 
      mypage.do_action_one
      mypage.my_element_exists
   end
end
  

Когда я запускаю это, я получаю сообщение об ошибке

неопределенный метод ‘page’ для MyPageHelper:Class (NoMethodError)

Функция страницы отлично работает в файле steps, но, похоже, у нее просто проблема с вызовом из класса MyPageHelper. Возможно ли это сделать? Есть ли оператор using, который мне нужно добавить?

Спасибо!

Комментарии:

1. calabash-ios находится в тегах, но вы используете Calabash::ABase, который из calabash-android. В этом проблема?

2. ах, очень возможно. У меня есть тесты для Android и ios. Что я должен использовать в тестах ios вместо ABase?

3. Я изменил ее на IBase и повторно запустил, но все равно столкнулся с той же проблемой.

Ответ №1:

Боюсь, что я не знаю, как ответить на ваш вопрос напрямую.

Рискуя быть обжигающим, я рекомендую альтернативный подход.

Вариант 1: Если вам не нужен вспомогательный класс, не беспокойтесь об этом.

Я понимаю, что ваш фактический код, вероятно, более сложный, но нужен ли вам помощник здесь? Почему бы не реализовать do_multi_action_step в классе MyPage как метод?

 def do_multi_action_step
     my_element_exists
     my_other_method
end
  

Вариант 2: передать экземпляр MyPage

На вашем шаге вы создали экземпляр MyPage. Вы должны использовать этот экземпляр вместо создания нового MyPageHelper.do_multi_action_step .

 def self.do_multi_action_step(my_page)
  my_page.my_element_exists
  my_page.my_other_method
end
  

Пример:

 # my_page_steps.rb
Given /^I am on my page$/ do
  # use the await method to wait for your page
  my_page = page(MyPage).await

  # pass an instance instead of creating a new one
  MyPageHelper.do_multi_action_step(my_page)

  # or just use a method on the MyPage instance
  my_page.do_multi_action_step
end

# my_page_helper.rb
class MyPageHelper
  # pass the page as an object
  def self.do_multi_action_step(my_page)
    my_page.my_element_exists
    my_page.my_other_method
  end
end

# my_page.rb
require 'calabash-cucumber/ibase'

class MyPage < Calabash::IBase

  # some view that is unique to this page
  def trait
    "view marked:'some mark'"
  end

  def my_element_exists
    element_exists("view marked:'foo'")
  end

  def my_other_method
    puts 'do something else'
  end

  # why not do this instead?
  def do_multi_action_step
    my_element_exists
    my_other_method
  end
end