如何用RSpec测试Ruby中的非实例/非类独立方法?
如何测试Ruby中的全局独立方法
核心问题分析
你的测试失败主要有两个原因:
- 原
cypher方法最后用puts输出结果,而非返回结果,RSpec的expect断言的是方法的返回值,不是输出内容。 - 测试文件未正确加载定义
cypher方法的脚本,导致找不到该方法。
解决步骤
1. 修正原方法的返回逻辑
Ruby方法默认返回最后一行代码的执行结果,把puts替换为直接返回拼接后的字符串:
# caesar_cipher.rb def cypher(string, factor) string_array = string.downcase.split('') cyphered_array_alpha = [] # 假设你已实现加密逻辑 string_array.each do |item| # 省略加密逻辑,示例为简单字符偏移 cyphered_array_alpha << (item.ord + factor).chr end cyphered_array_alpha.join # 直接返回结果,而非puts输出 end
2. 在测试文件中加载目标脚本
使用require_relative导入定义cypher方法的文件,确保测试能找到这个全局方法:
# caesar_cipher_spec.rb require_relative 'caesar_cipher' # 导入你的脚本文件 describe "#cypher" do it "returns characters adjusted by the given factor" do expect(cypher("abcd", 1)).to eql('bcde') end end
3. 运行测试
直接执行RSpec命令即可:
rspec caesar_cipher_spec.rb
补充说明
- 全局方法默认挂载在
Object类下,RSpec的测试上下文可以直接调用,不需要用{cypher()}这类特殊语法。 - 如果需要测试方法的输出内容(比如原代码的
puts),可以用RSpec的output断言:
it "outputs the cyphered string" do expect { cypher("abcd", 1) }.to output("bcde\n").to_stdout end
内容的提问来源于stack exchange,提问作者jbk
相关产品推荐
相关产品推荐

