0

在我的 ApplicationController 中,我公开了一个可由所有控制器共享的变量:

before_filter :expose_group

protected

    # Much simplified
    def expose_group
      @user_group = LearningGroup.find_by_uid(cookies[:user_group])
    end

我正在使用 RSpec 测试我的控制器,对于其中一些测试,我需要能够在它们运行之前将 @user_group 设置为已知值。测试 ApplicationController 的子类时如何设置此变量?

注意:我需要一种为测试设置@user_group 的方法。控制使用存根的返回值expose_group无济于事,因为@user_group仍然为零。

4

3 回答 3

1

我会完全废弃实例变量并使用助手。GroupsHelper从in之类的东西开始app/helpers/groups_helper.rb

module GroupsHelper
  def user_group
    @user_group ||= group_from_cookie
  end

  def user_group=(group)
    @user_group = group
  end

  private

  def group_from_cookie
    group_uid = cookies[:user_group]
    LearningGroup.find_by_uid group_uid unless group_uid.nil?
  end
end

然后includeApplicationController.

class ApplicationController < ActionController::Base
  include GroupsHelper
  # ...
end

现在,spec/support为您的测试定义一个助手。

include ApplicationHelper

def join_group group_uid
  # whatever preparation you may need to do as well
  cookies[:user_group] = group_uid
end

测试可能类似于:

it 'does something awesome' do
  join_group 'my awesome group id'
  # ...
  expect(your_subject).to be_awesome
end

当您运行测试时,user_group将返回由您已经分配给 cookie 对象的值确定的值。

这还有一个好处,那就是只调用而不是在多个测试中到处join_group存根。LearningGroup

于 2013-08-26T14:02:33.103 回答
1

我只是简单地存根方法,例如:

LearningGroup.should_receive(:find_by_uid).and_return known_value
于 2013-08-26T13:44:45.720 回答
0

你可以存根expose_group方法返回你想要的。

在您的规格中:

controller.stub(expose_group: 'what you need')
于 2013-08-26T13:42:43.450 回答