我在测试我的控制器和使用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
任何帮助都会很棒!
答案 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
。
在我看来,这似乎是一种必要的邪恶。但如果有任何人有一个很好的解释或解决方法,我很乐意继续讨论。