Хобрук: Ваш путь к мастерству в программировании

Неопределенная ошибка метода для класса при использовании с переменными класса

Я тестирую приложение, используя ruby ​​и watir. У меня есть файл init.rb с этим кодом

 class Init_Test
   def initialize
     @browser = Watir::Browser.new :firefox
   end 

   def login_with_creds username,password
     @browser.goto 'https://54.69.254.137/webui#/landing'
     sleep(2)
     @browser.driver.manage.window.maximize
     @browser.button(:class => 'sign-in md-button md-default-
     theme').when_present.click
     sleep(2)
     @browser.text_field(:id =>'input_001').set(username)
     sleep(2)
     @browser.text_field(:id =>'input_002').set(password)
     sleep(2)
     @browser.button(:class =>'md-primary md-raised md-button md-default-theme').click
     sleep(2)
     return @browser
   end
 end

Я наследую этот файл в файл с именем ann.rb

require "watir"
require "watir-webdriver"
require_relative 'init'
class Post < Init_Test
  @@b = login_with_creds("[email protected]","password")

  def test_discuss
    @@b.input(:id =>'input_002').when_present.click
    sleep(1)
    @@b.element(aria_label:'What do you want to do?').when_present.click
    sleep(1)
    @@b.element(:id =>'select_option_00G').when_present.click
    sleep(1)
    @@b.element(aria_label:'About what?').when_present.click
    sleep(1)
    @@b.element(:id =>'select_option_00P').when_present.click
    sleep(1)
    @@b.textarea(:id =>'input_00N').when_present.set('Discuss about java script and later test the    application??')
    sleep(1)
    @@b.span(:text, 'Submit').when_present.click
    sleep(1)
  end

  def test_question
    @@b.input(:id =>'input_002').when_present.click
    sleep(1)
    @@b.element(aria_label:'What do you want to do?').when_present.click
    sleep(2)
    @@b.element(:id =>'select_option_014').when_present.click
    sleep(2)
    @@b.element(:id =>'select_017').when_present.click
    sleep(1)
    @@b.element(:id =>'select_option_01D').when_present.click
    sleep(1)
    @@b.textarea(:class =>'ng-pristine md-input ng-invalid ng-invalid-
    required ng-touched').when_present.set('test question')
    sleep(1)
    @@b.span(:text, 'Submit').when_present.click
  end
end

a = Post.new
a.test_discuss
a.test_question

Как видите, я использовал переменную класса @@b и присвоил ей метод log_in_creds, а затем использовал переменную класса для выполнения других действий. Однако, когда я запускаю его, он не выдает ошибку метода для log_In_creds

a.rb:6:in `<class:Post>': undefined method `login_with_creds' for 
Post:Class (NoMethodError)
from a.rb:4:in `<main>'

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


Ответы:


1

Как правило, когда вы вызываете метод Ruby (methodA) без явного получателя, это то же самое, что и вызов self.methodA. В зависимости от позиции кода объект, на который ссылается self, может меняться.

class Init_Test
  # self refers to Init_Test, a class object
  def login_with_creds username,password # define a method for the instances of Init_Test
    # self refers to an instance of Init_Test
  end
end

Теперь в Post:

class Post < Init_Test
  @@b = login_with_creds("[email protected]","password")

Он попытается вызвать login_with_creds с self, относящимся к Post, который является объектом класса (одноэлементным). Однако login_with_creds определен как метод экземпляра для всех экземпляров Init_Test, который может вызываться для всех экземпляров класса Post из-за наследования. Это не для объекта Post или объекта Init_Test.

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

Вы можете переписать его как

class Post < Init_Test
  def initialize
    super
    @b = login_with_creds("[email protected]","password")
  end

  def test_discuss
    @b.input(:id =>'input_002').when_present.click
    sleep(1)
    ...
  end

  def test_question
    @b.input(:id =>'input_002').when_present.click
    sleep(1)
    ...
  end
end

a = Post.new
a.test_discuss
a = Post.new # ensure clean state
a.test_question

Возможно, лучше использовать существующую тестовую среду, такую ​​как minitest, rspec и т. д.

25.07.2015
  • Привет, я попытался переписать его так, как вы сказали, однако выдает следующую ошибку: неопределенный метод login_with_creds' for nil:NilClass (NoMethodError)from post_announcements.rb:46:in new' из post_announcements.rb:46:in `‹main›' 25.07.2015
  • @MaheshMesta Я обновил свой код, чтобы сначала вызвать суперконструктор в Post. Может быть, будет понятнее, если вы сможете вставить обновленный код в вопрос. 25.07.2015
  • Привет, мне жаль, что ваш код работает отлично. Я забыл добавить «супер» в код. Большое вам спасибо !! 29.07.2015
  • @MaheshMesta, если это поможет, пожалуйста, примите ответ :) 29.07.2015
  • Новые материалы

    Ограниченные машины Больцмана (RBM)
    Практическое руководство по обучению RBM.pdf Задний план RBM использовались в качестве генеративных моделей для многих различных типов данных, включая помеченные и немеченые. В их условной..

    Обнаружение маски или без маски с YOLO😷
    Это руководство по созданию пользовательской модели обнаружения объектов для обнаружения людей, носящих или не носящих маски в общественных местах, созданной с использованием YOLO v3. Модель..

    Управление приборами в чистом PHP
    Этот пост дополняет эти: E2e тестирование Работа с несколькими средами . Мы разработали это решение для базы данных MariaDB, оно может отличаться, если вы используете другую базу..

    Неделя 1 — Кентерберийские рельсы.
    Неделя 1 — Кентерберийские рельсы. So. Мы все еще живы, все еще усердно работаем и еще не пассивно-агрессивно рассылаем друг другу сообщения «за мое последнее сообщение в Slack…», поэтому, на..

    Цена завтрашнего дня  — Джефф Бут
    Технологический прогресс в наши дни происходит с молниеносной скоростью, и мы не в состоянии это понять. Джефф в основном говорит о влиянии технологий на экономику по всему миру. Он твердо верит..

    Данные: суперсила современного бизнеса
    В цифровой среде данные превратились из простого побочного продукта бизнес-операций в центральный актив, стимулирующий рост и инновации. Крейг Манди, бывший главный директор по стратегии..

    Как симулировать серию пенальти на Python с помощью симуляции Монте-Карло, часть 1: генерация функций
    Серия пенальти была огромным испытанием во время чемпионата мира по футболу. Они вызвали много споров в социальных сетях и новостных агентствах. Даже финальный матч турнира решался по..