You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby项目中如何从YAML文件读取登录凭证?

解决Ruby项目中YAML登录凭证读取的NoMethodError问题

嘿,我来帮你搞定这个YAML读取的问题!咱们从几个关键的错误点逐一排查:

1. 先修正YAML文件的缩进问题

YAML对缩进要求非常严格,你提供的YAML结构有语法错误,这会导致加载后的数据结构不符合预期,是出现nil:NilClass错误的核心原因之一。修正后的YAML应该是这样的(注意子键的缩进):

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

2. 修复YamlHelper中的路径问题

你的yml.rb里,文件路径拼接的时候缺少了目录分隔符,导致加载的文件路径无效,加载后@env可能为nil。另外推荐用更安全的YAML.safe_load_file替代YAML.load_file:

require 'rspec'
require 'yaml'

class YamlHelper
  @env = {}

  def initialize(file_path = "#{Dir.pwd}/your_yml_file.yml") # 这里加了斜杠,替换成实际的文件名
    @env = YAML.safe_load_file(file_path)
  end

  def get_variables
    @env
  end
end

注意:把your_yml_file.yml替换成你实际的YAML文件名,比如credentials.yml

3. 修正test.rb中的变量与语法错误

你的测试代码里存在几个明显的问题:

  • 变量名不匹配:你把数据赋值给了data,但后面用的是test_data
  • expect语法错误:缺少括号,且没有断言逻辑
  • 多余的expect data['valid_user'](你的YAML里没有这个键)

修正后的test.rb代码:

describe 'My behaviour' do
  before(:each) do
    @browser = Selenium::WebDriver.for :firefox
  end

  it 'verifies yml login' do
    yaml_helper = YamlHelper.new
    test_data = yaml_helper.get_variables # 统一变量名

    # 正确的expect断言语法
    expect(test_data['login']['urls']['gmail']).to eq("https://accounts.google.com/signin")
    expect(test_data['login']['users']['username']).to eq("something")
    expect(test_data['login']['users']['password']).to eq("something_new")
  end

  after(:each) do
    @browser.quit
  end
end

最后再检查几个常见坑

  • 确保YAML文件的路径正确:如果YAML文件不在项目根目录,要调整YamlHelper初始化时的路径
  • 检查YAML文件的编码:确保是UTF-8编码,避免加载时出现乱码或解析错误
  • 如果你用的是Ruby 3.0+,可以考虑用YAML.load_file的关键字参数symbolize_names: true,这样可以用符号键(比如test_data[:login][:users][:username])来访问数据

内容的提问来源于stack exchange,提问作者Mary

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:43:52