Ruby Koans符号测试:为何测试用例与IRB结果不一致?
问题解答
核心原因很简单:你在IRB里没定义过test_method_names_become_symbols方法,但Ruby Koans的运行环境里这个方法是存在的。
Ruby有个特性:所有方法名在内部都会被存储为符号(Symbol)。只要你定义了一个方法,对应的符号就会被自动加入到Symbol.all_symbols的列表中。
- 在你的IRB会话里,你只是直接执行了符号收集的代码,从来没创建过
test_method_names_become_symbols这个方法,所以这个符号根本不存在,include?自然返回false。 - 但在Ruby Koans的测试场景里,
test_method_names_become_symbols本身就是你正在编写的测试方法。当Koans加载测试文件时,这个方法已经被定义,对应的符号已经生成并加入到符号列表里了,所以断言true才是符合运行环境的正确结果。
你可以在IRB里验证这个逻辑:
# 先定义对应的方法 def test_method_names_become_symbols; end # 再收集符号并检查 symbols_as_strings = Symbol.all_symbols.map { |x| x.to_s } symbols_as_strings.include?("test_method_names_become_symbols") # 此时会返回true
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

