Ruby on rails 如何访问对象';在存根时,是否删除实例变量?

Ruby on rails 如何访问对象';在存根时,是否删除实例变量?,ruby-on-rails,ruby,rspec,instance-variables,Ruby On Rails,Ruby,Rspec,Instance Variables,我正在为一个web应用程序编写一些测试,其中一个控制器调用Scope对象上的resolve,该对象返回一个稍微修改过的Scope。在测试中,我想将此方法存根以返回原始范围(作为参数传递给scope.initialize) 范围对象 class Scope def initialize(scope) @scope = scope end def resolve # Return a modified scope. end end it "does someth

我正在为一个web应用程序编写一些测试,其中一个控制器调用
Scope
对象上的
resolve
,该对象返回一个稍微修改过的Scope。在测试中,我想将此方法存根以返回原始范围(作为参数传递给
scope.initialize

范围对象

class Scope

  def initialize(scope)
    @scope = scope
  end

  def resolve
    # Return a modified scope.
  end
end
it "does something" do
  allow_any_instance_of(Scope).to receive(:resolve).and_return(???.scope)
  get :show
  # Do some assertions.
end
控制器

class FooController < ApplicationController

  def show
    foos = Scope.new(Foo.some_foos).resolve
    respond_with foos
  end
end
我需要在
的位置放置什么,以便在
范围的任何实例上存根
resolve
方法,以返回创建它时使用的原始范围


我使用的是Rspec 3.4.2。

首先,您需要在作用域上创建一个属性读取器,这样您就可以访问
@Scope
,而无需使用
实例变量\u get

class Scope

  attr_reader :scope

  def initialize(scope)
    @scope = scope
  end

  def resolve
    # Return a modified scope.
  end
end
如果使用块实现,接收器将作为第一个参数传递:

allow_any_instance_of(Scope).to receive(:resolve) do |s|
  s.scope
end
然而,强烈反对使用
allow\u任何
实例,这通常表明您的测试对控制器的工作方式而不是实际操作进行了过多的研究

相反,我会使用一个单元测试来测试
范围
,并请求与功能规格一起测试控制器的规格。这就是我测试使用Pundit的应用程序的方式,这是一种健壮的策略