控制器测试中的守望者

时间:2012-02-13 13:15:23

标签: ruby-on-rails rspec stubbing warden

我在测试我的控制器和使用Warden时遇到了问题。

所有示例都指向存根request.env['warden']。当我调用env['warden']时,这会导致我的控制器出现问题,然后返回nil

对于一个粗略的例子,使用它:

request.env['warden'] = double(Warden, :authenticate => nil,
                                          :authenticate! => nil,
                                          :authenticated? => false)

这样一个简单的过滤器:

before_filter do
  redirect_to new_user_session_url unless env['warden'].authenticated?
end

我得到nil

我设法使用controller.env['warden'] = ...让它工作,并且它有效。 这是有道理的,因为它坐在控制器级别,所以我想我的问题是在我看过所有例子时它不会起作用。

我在spec_helper

中有这个
config.include Warden::Test::Helpers

任何帮助都会很棒!

2 个答案:

答案 0 :(得分:4)

我为Warden编写了控制器测试助手。

http://kentaroimai.com/articles/1-controller-test-helpers-for-warden

答案 1 :(得分:1)

尽管有很多例子告诉你在Rails应用程序中通过env['warden']实现Warden。这似乎是通过request.env['warden']访问它的正确方法。

它通过在测试期间在我的控制器中提高env来发现这一点,并且总是出现nil

似乎在Warden,https://github.com/hassox/warden/blob/master/lib/warden/proxy.rb#L13 机架环境有一个访问器,由于控制器测试中没有Rack,因此在测试模式下不存在。 请有人检查一下。

因此,当在RSpec中存根request.env时,您的实施需要指向request.env

在我看来,这似乎是一种必要的邪恶。但如果有任何人有一个很好的解释或解决方法,我很乐意继续讨论。