如何在Ruby调试器中运行RSpec expect语句并迭代调试
调试RSpec复杂期望的实用技巧
1. 用匹配器的matches?方法实现“dry run”
RSpec的所有匹配器都自带matches?方法,调用它会直接返回布尔值表示是否匹配,不会触发测试失败退出,刚好满足你快速迭代验证的需求。
针对你的例子,直接在调试控制台里这样写:
# 检查整个数组是否符合预期,返回true/false all(have_no_key(:the_key)).matches?(the_array)
(顺便提一句:RSpec内置了have_no_key匹配器,比not(have_key)更简洁,你原来的写法可以换成这个)
如果要分步验证逻辑,也可以拆开来测试:
# 先验证单个哈希是否符合条件 have_no_key(:the_key).matches?(the_array.first) # 再验证整个数组的匹配逻辑 all(have_no_key(:the_key)).matches?(the_array)
2. 临时禁用RSpec的失败终止机制
如果你还是想直接运行expect语句、不想改写法,可以在调试会话中执行以下代码,临时关闭失败时的异常抛出:
# 覆盖失败通知器,让expect失败时不终止测试 RSpec::Support.failure_notifier = ->(_) {}
之后你在调试器里运行expect(the_array).to all(have_no_key(:the_key)),即使失败也不会退出调试模式,能继续修改迭代。如果要恢复正常行为,重置失败通知器即可:
# 恢复默认的失败通知逻辑 RSpec::Support.failure_notifier = RSpec::Support::FailureNotifier.new
3. 利用调试器的表达式求值功能
在RubyMine的调试器里,你可以直接在“表达式求值”窗口输入匹配器的matches?调用,或者修改后的expect语句(在禁用失败终止后),每次修改后直接求值,不用重新启动调试会话,快速验证不同的期望组合。
内容的提问来源于stack exchange,提问作者Damian Pereira
相关产品推荐
相关产品推荐

