如何在 ruby 中使用来自 yaml 的登录凭据
Posted
技术标签:
【中文标题】如何在 ruby 中使用来自 yaml 的登录凭据【英文标题】:How to use login credentials from yaml in ruby 【发布时间】:2018-11-04 19:23:21 【问题描述】:我是 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 中通过 users/username ... :( 。我在“it”中添加了一个变量来存储 yml 类,最后我尝试使用
expect data['valid_user']
expect data['login']['urls']['gmail']
expect data['login']['users']['username']
但在终端中我收到错误“NoMethodError: undefined method `[]' for nil:NilClass”
更新
这是我的yml.rb
require 'rspec'
require 'yaml'
class YamlHelper
@env =
def initialize
file = "#Dir.pwdpath 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
有人可以看看吗? 在此先感谢
祝你有美好的一天
【问题讨论】:
看看什么?你能显示 yml.rb 文件吗? 您好 SteveTurczyn, 你如何定义data
?发布您的完整 test.rb
文件。
嗨,欢迎来到 ***。您能否在终端中分享有关该错误的更多信息?它附近有行号或文件名吗?
【参考方案1】:
看起来代码几乎在那里。当我调试这类东西时,我通常会先尝试将其提炼为最基本的测试
类似:
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
。当您深入研究嵌套哈希时,这种错误相当普遍。它意味着两件事之一:
-
您已正确下降到哈希中,但 YAML 中不存在数据。
数据存在于 YAML 中,但您没有正确获取它。
您可以进行的一项更改将使此代码更具弹性:替换:
test_data['login']['users']['username']
与:
test_data.dig('login', 'users', 'username')
后者使用dig,它深入研究数据结构并尝试返回您所追求的值,但如果它在任何时候返回nil
,它只会返回nil
,而不是抛出异常。
最后,对于您在此处粘贴的测试,您不需要 before(:each)
或 after(:each)
块 - Selenium 仅用于浏览器测试。
【讨论】:
非常感谢@spikeheap。它适用于 test_data.dig('login','users', 'username') 很好,如果这有帮助,请在此答案上打勾:)以上是关于如何在 ruby 中使用来自 yaml 的登录凭据的主要内容,如果未能解决你的问题,请参考以下文章
如何表示将 ruby 哈希转换为 yaml 的 aws 内部函数