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
相关产品推荐
相关产品推荐

