【问题标题】:Accessing controller instance variables from within an rspec controller spec从 rspec 控制器规范中访问控制器实例变量
【发布时间】:2015-12-14 14:55:02
【问题描述】:

难道我不能从我的 rspect 测试中看到在控制器操作中创建的实例变量吗?

# /app/controllers/widget_controller.rb
...
def show
  @widget = ...
  puts "in controller: #{@widget}"
end
...

--

# /spec/controllers/widget_controller_spec.rb
RSpec.describe WidgetController, type: :controller do
...
describe "GET #show" do
  it "assigns the requested widget as @widget" do
    get :show, { :id => 1 } # this is just an example - I'm not hardcoding the id

    puts "in spec: #{@widget}"
  end
end
...

这是我运行该规范时得到的输出:

controller: #<Widget:0x007f9d02aff090>
in spec:

我认为我应该在我的控制器规范中访问 @widget 是不是错了?

【问题讨论】:

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


    【解决方案1】:

    使用assigns 方法*noteassigns 现在已弃用。有关信息,请参阅我的答案底部)

    it "assigns the @widget"
      expect(assigns(:widget)).not_to be_nil
    end
    

    当然,您可以随意检查widget,但在您提供的控制器代码中没有看到@widget 是什么,我只是检查了它是否是nil

    如果您想要 puts 小部件,就像在您的示例中一样,只需使用 assigns 打印它

    puts assigns(:widget)
    

    编辑: assigns 现已弃用(请参阅:https://apidock.com/rails/ActionController/TestProcess/assigns

    如果您想继续使用assigns,您需要安装rails-controller-testing gem。

    否则,您可以使用 rails-controller-testing gem 内部使用的东西:@controller.view_assigns[]

    【讨论】:

      【解决方案2】:

      #assigns 已弃用。这是避免拉入 rails-controller-testing gem 的解决方案

      虽然它可以是 code smell 来测试控制器中的实例变量,但要升级旧应用程序,您可以利用 #instance_variable_get

      Rspec 示例: expect(@controller.instance_variable_get(:@person).id).to eq(person_id)

      【讨论】:

        【解决方案3】:

        在 Rails 5 中,assigns 现在已拆分为新的 rails-controller-testing gem。

        您可以安装 gem 以继续使用 assigns,或者您可以使用 rails-controller-testing gem 内部使用的,@controller.view_assigns[]

        【讨论】:

        • @controller.view_assigns['widget']
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-01-28
        • 2012-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        相关资源
        最近更新 更多