【问题标题】:How do I test a local variable inside a controller with Rspec?如何使用 Rspec 测试控制器内的局部变量?
【发布时间】:2015-05-04 21:49:29
【问题描述】:

在我的Dashboard#Index 中,我有这个:

  def index        
    tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)    
  end

如何使用 RSpec 进行测试?

我试过了:

  expect(assigns(tagged_nodes)).to match Node.includes(:user_tags).tagged_with(u1.email)

但这给了我这个错误:

 NameError:
       undefined local variable or method `tagged_nodes' for #<RSpec::ExampleGroups::DashboardController::GETIndex:0x007fe4edd7f058>

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 rspec


    【解决方案1】:

    您不能(也不应该)测试局部变量。但是,您可以并且应该测试以@ 开头的instance 变量。为此,您使用 assigns 帮助器,将实例变量的名称作为符号传递给它。如果我们想要实例变量@tagged_nodes 的值,我们调用assigns(:tagged_nodes)(注意:)。

    所以如果你的控制器方法是这样的:

    def index        
      @tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)    
    end
    

    ...您将使用assigns(:tagged_nodes) 访问@tagged_nodes

    expect(assigns(:tagged_nodes))
      .to match Node.includes(:user_tags).tagged_with(u1.email)
    

    【讨论】:

    • 是的....我知道如何测试实例变量。那么我的控制器中应该没有局部变量吗?
    • 你可以有局部变量,但你不需要测试它们。你应该测试控制器的外在行为:给定一个特定的请求,它给出什么响应(或者它传递给视图的数据)。局部变量是私有状态,通常你不会测试私有状态。
    • 嗯,好的。这是有道理的。
    【解决方案2】:

    试试这个代码:

    def index        
      tagged_nodes = Node.includes(:user_tags).tagged_with(current_user.email)    
    end
    

    您将使用 controller.tagged_nodes

    访问 tagged_nodes
    expect(controller.tagged_nodes)
      .to match Node.includes(:user_tags).tagged_with(u1.email)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      相关资源
      最近更新 更多