如何用RSpec Double替代测试中临时创建并包含FeatureQuery的Queryable类?
使用RSpec Double替代临时类的方案
当然可以用RSpec Double来实现,而且这种方式更干净,不会污染全局命名空间,也更符合RSpec的测试风格。以下是几种可行的实现方式:
方式一:给实例Double直接扩展模块
如果只需要一个包含FeatureQuery模块方法的实例,直接给Double扩展模块即可:
let(:queryable) do double.tap { |obj| obj.extend(FeatureQuery) } end
这里用extend是因为要把模块的实例方法添加到单个实例上;如果需要模拟类层面的模块方法(比如模块里的self.xxx方法),可以给类Double使用include。
方式二:创建类Double并包含模块
如果需要模拟整个类的行为(比如后续要测试类方法或实例化逻辑),可以用class_double先创建类的替身,再包含模块后实例化:
let(:queryable_class) do class_double("Queryable").tap { |cls| cls.include(FeatureQuery) } end let(:queryable) { queryable_class.new }
注意事项
- 如果
FeatureQuery模块依赖宿主类的某些方法(比如模块里调用了self.some_method或实例方法some_method),你需要在Double上手动stub这些依赖方法,避免测试报错。 - 相比你原来的临时类写法,用Double的方式不会在全局命名空间留下残留的
Queryable类,避免不同测试用例之间的命名冲突。
内容的提问来源于stack exchange,提问作者aarkerio
相关产品推荐
相关产品推荐

