【问题标题】:Ruby-Rspec: Initialize PageObjects once in spec_helper instead of each specRuby-Rspec:在 spec_helper 而不是每个规范中初始化 PageObjects
【发布时间】:2018-06-22 13:47:53
【问题描述】:

我在一个名为 PageObjects 的文件中为 xpaths 设置了变量。我运行的每个规范都使用“p = PageObjects.new”初始化页面对象。但是,我想在“spec_helper.rb”而不是每个规范中初始化一次“p = PageObjects.new”。

这仍然给我“错误:未初始化的常量 PageObject”...

require 'selenium-webdriver'
require 'yaml'
require 'rspec/retry'
require 'pry'
require 'bundler/setup'

p = PageObject.new
RSpec.configure do |config|
  config.default_sleep_interval = 1
  config.default_retry_count = 4
  config.verbose_retry = false
  config.display_try_failure_messages = true
  config.exceptions_to_retry = [Net::ReadTimeout, Capybara::ElementNotFound]
end

有没有办法通过在 spec_helper 中而不是在每个规范中初始化 PageObject 来实现我的目标?

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    RSpec helpers 似乎是您的完美解决方案

    定义 helper.rb

    module Helpers
      def p
        @page_object ||= PageObject.new
      end
    end
    

    配置 RSpec 以包含它:

    RSpec.configure do |c|
      c.include Helpers
    end
    

    然后您可以使用p 方法,该方法将为您提供 PageObject:

    specify do
      expect(p).to be_a(PagObject)
      expect(p.object_id).to eq(p.object_id)
    end
    

    【讨论】:

      【解决方案2】:

      您实际上希望在测试之间维护您的测试数据库。由于多种原因,这很危险,最明显的是以前的测试会影响未来的测试。当您处理相同的 PageObject 时,您需要在测试之间重置它。

      一方面,启用/禁用它的选项可以在以下位置找到:

      https://relishapp.com/rspec/rspec-rails/docs/transactions,即:

      当你运行 rails generate rspec:install 时,spec/rails_helper.rb 文件包含以下配置:

      RSpec.configure do |config|
        config.use_transactional_fixtures = true
      end
      

      此设置的名称有点误导。它的真正含义 在 Rails 中是“在事务中运行每个测试方法”。在里面 rspec-rails 的上下文,它的意思是“在一个 交易。”

      这个想法是从一个干净的数据库开始每个示例,创建 该示例所需的任何数据,然后删除该数据 只需在示例结束时回滚事务即可。

      禁用事务如果您更愿意自己管理数据,或者 使用另一个工具,如 database_cleaner 为您完成,只需告诉 RSpec 告诉 Rails 不要管理事务:

      RSpec.configure do |config|
        config.use_transactional_fixtures = false
      end
      

      【讨论】:

      • 页面对象只是网络元素的静态变量。即)“continue_button:'#continue'”。没有要处理的共享数据。规格只是简单地浏览各种网页。我的 page_objects 文件的重点是,我可以通过“p.continue_button”而不是“driver.find_elements(:css, 'element id')”调用 Web 元素
      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 2015-10-18
      • 1970-01-01
      相关资源
      最近更新 更多