如何在ruby中使用yaml的登录凭据

时间:2018-05-25 11:42:36

标签: ruby

我是红宝石的新手,我无法继续使用登录信用卡。来自一个ruby项目的yml文件。我有一个基本的yml文件

login:
  urls:
    gmail: "https://accounts.google.com/signin"
  users:
        username: something
        password: something_new

我已经创建了一个带有require yml的yml.rb,并访问了yml路径&加载文件。 但我不知道如何通过我的test.rb中的用户/用户名...:。我已经添加了"它"一个变量来存储yml类最后我尝试了

expect data['valid_user']

expect data['login']['urls']['gmail']
expect data['login']['users']['username'] 

但在终端我收到错误" NoMethodError:未定义的方法`[]'为零:NilClass"

更新 这是我的yml.rb

require 'rspec'
require 'yaml'

class YamlHelper
  @env = {}
  def initialize
    file = "#{Dir.pwd}path of yml file"
    @env = YAML.load_file(file)
  end

  def get_variables
    @env
  end
end

这是我的test.rb文件

describe 'My behaviour' do
  before(:each) do
    @browser = Selenium::WebDriver.for :firefox 
  end
  it 'verifies yml login' do
    yaml_helper = YamlHelper.new
    data = yaml_helper.get_variables
    expect data['valid_user']
    expect test_data['login']['urls']['gmail']
    expect test_data['login']['users']['username']
    expect test_data['login']['users']['password']
  end
  after(:each) do @browser.quit   
 end

有人可以看看吗? 提前谢谢

度过美好的一天

1 个答案:

答案 0 :(得分:0)

看起来代码几乎。当我调试这种事情时,我会经常尝试将其提炼到最基本的测试

类似的东西:

require 'yaml'
file = "#{Dir.pwd}/data.yml"
data = YAML.load_file(file)

data['valid_user']
#=> nil

data['login']['urls']['gmail']
#=> "https://accounts.google.com/signin"

data['login']['users']['username']
#=> "something"

从上面您可以看到test.rb文件中可能存在拼写错误:test_data最有可能是data。此外,您的YAML文件不包含valid_user密钥,因此您可能希望将其从测试中删除,至少目前是这样。

其他两个键加载正常。

您看到的错误NoMethodError: undefined method '[]' for nil:NilClass表示您实际上是nil哈希的其中一个哈希变量就像哈希一样正在处理。当你潜入嵌套的哈希时,这种bug是相当普遍的。它意味着两件事之一:

  1. 您已正确进入哈希值,但数据不存在于YAML中。
  2. 数据存在于YAML中,但您没有正确使用它。
  3. 您可以进行的一项更改将使此代码更具弹性,取而代之的是:

    test_data['login']['users']['username']
    

    使用:

    test_data.dig('login', 'users', 'username')
    

    后者使用dig,它深入研究数据结构并尝试返回您之后的值,但如果它在任何时候返回nil,它将只返回{{ 1}},而不是抛出异常。

    最后,对于您在此处粘贴的测试,您不需要nilbefore(:each)块 - 只有浏览器测试才需要Selenium。