如何使用Rspec测试控制器内的局部变量?

时间:2015-05-04 21:49:29

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

在我的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>

2 个答案:

答案 0 :(得分:9)

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

因此,如果您的控制器方法如下所示:

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

...您可以@tagged_nodes访问assigns(:tagged_nodes)

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

答案 1 :(得分:-1)

试试这段代码:

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)