Ruby-Rspec:在spec_helper中而不是每个规范中一次初始化PageObjects

时间:2018-06-22 13:47:54

标签: ruby rspec

我在名为PageObjects的文件中为xpath设置了变量。我运行的每个规范都使用“ 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来实现我的目标?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

将其放在一侧,可以在以下位置找到启用/禁用此功能的选项:

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

  

运行rails时会生成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