4

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

所有示例都指向 stubbing 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

任何帮助都会很棒!

4

2 回答 2

4

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

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

于 2012-06-22T16:15:24.890 回答
1

尽管有很多例子告诉你在 Rails 应用程序中实现 Warden env['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.

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

于 2012-02-14T12:11:19.517 回答