用rspec在ruby元编程中模拟动态生成的类

用rspec在ruby元编程中模拟动态生成的类,ruby,rspec,mocking,metaprogramming,Ruby,Rspec,Mocking,Metaprogramming,我是TDD和元编程的新手,所以请容忍我 我有一个Reporter类(包装Garb ruby gem),它将动态生成一个新的report类,并在我点击方法时将其分配给GoogleAnalyticsReport模块。主要内容如下: #Reporter.rb def初始化(配置文件) @外形=外形 结束 def方法_缺失(方法,*args) 方法名称=方法名称 超级,除非有效的方法名称?(方法名称) 类名称=构建类名称(方法名称) klass=现有的_报告_类(类名称)|| 构建新报告类(方法名称、类

我是TDD和元编程的新手,所以请容忍我

我有一个Reporter类(包装Garb ruby gem),它将动态生成一个新的report类,并在我点击方法时将其分配给GoogleAnalyticsReport模块。主要内容如下:

#Reporter.rb
def初始化(配置文件)
@外形=外形
结束
def方法_缺失(方法,*args)
方法名称=方法名称
超级,除非有效的方法名称?(方法名称)
类名称=构建类名称(方法名称)
klass=现有的_报告_类(类名称)||
构建新报告类(方法名称、类名称)
klass.results(@profile)
结束
def build_new_report_类(方法名称、类名称)
klass=GoogleAnalyticsReports.const\u集(class\u名称,class.new)
klass.extend-Garb::Model
klass.metrics而不是:

@mock_model = mock('Garb::Model')
@mock_model.stub(:results) # doesn't work!
我想你想做:

Garb::Model.any_instance.stub(:results)

这将删除Garb::Model的任何实例以返回结果。您需要这样做,因为您实际上并没有将@mock_模型传递到任何将使用它的类/方法中,所以您必须更一般一些。

我的项目是rails 2.3,所以我必须将我的类拉到一个新的gem中,以便在升级rspec mock时摆脱对web pf的依赖。不过我还是有个问题。。。我们试图存根Garb::Model的任何实例,它实际上是一个模块,而不是一个类。Rspec给了我:Failure/Error:Garb::Model.any_instance.stub(:results)NoMethodError:Garb::Model:Module的未定义方法“any_instance”如何模拟扩展模块的类的任何实例??谢谢,我认为您需要RSPEC2.6或更高版本才能获得任何实例支持。就存根模块而言,据我所知,这是不可能的——除了在模块的eingen类上定义方法(def self.hello_world)之外。如果您不知道要存根的实例,那么我认为您的测试可能走错了方向..Derek同意-我认为我陷入了困境,因为我的代码不够正确(阅读:testable)。谢谢你的回答。对于任何阅读和感兴趣的人,我最终使用VCR和fakeweb删除Garb所需的http内容。请参见我的实现: