【问题标题】:Rails Rspec test session variable in decorator装饰器中的 Rails Rspec 测试会话变量
【发布时间】:2015-09-07 21:53:12
【问题描述】:

我有一个装饰器,它接收应用程序控制器作为变量,以便访问会话变量。比如:

navigation = NavigationDecorator(user_id, self)

自己就是 ApplicationController。

一切正常,但现在我必须对其进行测试,并且在 Rspec 中我做了

navigation = NavigationDecorator(user_id, ApplicationController.new)

在我的测试中,我得到:

ActionController::Metal#session delegated to @_request.session, but @_request is nil: #<ApplicationController:0x000000161363f0 @_routes=nil, @_action_has_layout=true, @_headers={"Content-Type"=>"text/html"}, @_status=200, @_request=nil, @_response=nil>

更新:

我是这样使用的:

def initialize(user, controller)
    @controller = controller
    ...
end

def retrieve_user_id
    user_id = @controller.session[:temporary_id] if @controller.session[:temporary_id]
    super
end

【问题讨论】:

  • 能展示一下NavigationDecorator的代码吗?你如何在那里使用ApplicationController?
  • 你好@SheinAlexey!我已经更新了我的问题

标签: ruby-on-rails ruby rspec controller


【解决方案1】:

我建议在测试中使用存根控制器,因为由于您正在编写单元测试(您正在编写单元测试,对吗?),您希望将您的被测系统(NavigationDecorator)与其依赖项(控制器)隔离开来.你可以写这个测试:

describe NavigationDecorator do 
  context 'user_id'
    it 'should take id from session' do 
      session = { temporary_id: 'temporary' } 
      controller = instance_double('ApplicationController', session: session)
      user = instance_double('User', id: 'user_id')
      subject = described_class.new(user, session)
      expect(subject.retrieve_user_id).to eq session[:temporary_id]
    end  
  end
end

测试表明我们有不需要的依赖项(控制器),立即通过会话会更干净(当然,如果可以的话):

describe NavigationDecorator do 
  context 'user_id'
    it 'should take id from session' do 
      session = { temporary_id: 'temporary' } 
      subject = described_class.new('local id', session)
      expect(subject.retrieve_user_id).to eq session[:temporary_id]
    end  

    it 'should take id from user when session is empty' do 
      controller = instance_double('ApplicationController', session: {})
      user = instance_double('User', id: 'user_id')
      subject = described_class.new(user, session)
      expect(subject.retrieve_user_id).to eq user.id
    end
  end
end

【讨论】:

  • 非常感谢!有了你的回答,我就能解决我的问题。只是一个简单的问题。如果我的装饰器也设置了一个会话变量,我怎么能在不重新设置会话和重新创建装饰器的情况下完成此操作?
  • 你能不能写个例子,我不完全明白你为什么需要重置会话?
猜你喜欢
  • 1970-01-01
  • 2014-12-19
  • 1970-01-01
  • 2021-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
相关资源
最近更新 更多