【问题标题】:Enforce Single Rails Controller Action Invocation From An RSpec Example从 RSpec 示例强制执行单个 Rails 控制器操作调用
【发布时间】:2016-10-19 18:38:18
【问题描述】:

在我为我的问题提供一些背景信息时,请耐心等待:

我最近将 CanCan 集成到我们的应用程序中,发现其中一个控制器 rspec 测试失败了。原来这是因为测试写得不好并且在控制器上调用了两次操作。

  it 'only assigns users for the organisation as @users' do
    xhr :get, :users, { id: first_organisation.to_param}
    expect(assigns(:users).count).to eq(3)

    xhr :get, :users, { id: second_organisation.to_param}
    expect(assigns(:users).count).to eq(4)
  end

注意,为简洁起见,示例已删减。

现在失败的原因是 rspec 对两个操作调用使用相同的控制器实例,并且 CanCan 仅在组织资源尚未加载时才加载它。

我可以接受以下原因:a) rspec 在示例范围内使用控制器的单个实例,b) CanCan 仅在资源不存在时才加载资源。

这里真正的问题是,在同一个示例中调用一个动作两次当然是个坏主意。现在 CanCan 的介绍突出了这个例子中的错误,但我现在担心可能有其他控制器测试也调用了两次动作,或者将来可能会编写这样的例子,这相当冗长,导致我我的问题:

是否可以强制控制器 rspec 示例只能调用单个控制器操作?

【问题讨论】:

    标签: ruby-on-rails unit-testing rspec cancan


    【解决方案1】:

    好的,看来我有一个解决方案:

    创建 unity_helper.rb 以进入规范/支持

    module UnityExtension
      class UnityException < StandardError
      end
    
      def check_unity
        if @unity
          raise UnityException, message: 'Example is not a unit test!'
        end
    
        @unity = true
      end
    end
    
    RSpec.configure do |config|
      config.before(:all, type: :controller)  do
        ApplicationController.prepend UnityExtension
        ApplicationController.prepend_before_action :check_unity
      end
    end
    

    然后在 rails_helper.rb 中

    require 'support/unity_helper'
    

    这实际上突出了另一个调用控制器两次的 rspec 控制器示例。

    我对其他解决方案或对我的改进持开放态度。

    【讨论】:

      猜你喜欢
      • 2015-01-12
      • 2011-07-09
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2023-03-08
      • 1970-01-01
      相关资源
      最近更新 更多