使用RSpec测试使用Devise的视图

23

我尝试在之前通过的rspec“视图规范”中添加Devise的user_signed_in?方法以使其通过。模板大致如下:

<% if user_signed_in? %>
  Welcome back.
<% else %>
  Please sign in.
<% endif %>

之前通过的视图规范看起来像这样:

require "spec_helper"

describe "home/index.html.erb" do

  it "asks you to sign in if you are not signed in" do
    render
    rendered.should have_content('Please sign in.')
  end

end
在添加了调用 user_signed_in? 后,它产生的错误是:
  1) home/index.html.erb asks you to sign in if you are not signed in
     Failure/Error: render
     ActionView::Template::Error:
       undefined method `authenticate' for nil:NilClass
     # ./app/views/home/index.html.erb:1:in `_app_views_home_index_html_erb__1932916999377371771_70268384974540'
     # ./spec/views/home/index.html.erb_spec.rb:6:in `block (2 levels) in <top (required)>'

在网上可以找到很多关于这个错误的参考资料,但我还没有找到一个足够详细的答案来使我的测试再次通过。我认为问题与视图有关(该视图正在从任何模型/控制器中隔离地进行测试),它没有一些关键的Devise基础设施可用。感谢您的建议。

此外,一旦测试通过,如何测试其他路径(用户已经登录)? 我认为这会非常相似。谢谢。

2个回答

43
你收到的错误是因为你需要包含devise测试助手。
通常你会将这个(你可能已经有了)添加到spec/support/devise.rb中。
RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
end

但是,既然你正在创建一个视图规范,你会需要像这样的东西:

RSpec.configure do |config|
  config.include Devise::TestHelpers, :type => :controller
  config.include Devise::TestHelpers, :type => :view
end

1
哇,我发誓我试过了... 但是,再次尝试后我的测试通过了。谢谢! - SingleShot
看起来RSpec::Core::FilterManager会查看"metadata",例如type来确定要运行哪些Example - Jared Beck
这对我很有用。因为我正在遵循这个指南:https://github.com/plataformatec/devise/wiki/How-To:-Test-controllers-with-Rails-3-and-4-%28and-RSpec%29 我还添加了一行来访问包含登录方法的模块,所以我也添加了:"config.extend ControllerMacros, :type => :view" 和控制器类似。 - jpa57
太棒了!成功了。 - Sravan

1

看一下Rails Composer,它将指导您通过选项(如测试、UI等)创建新的Rails项目。

创建一个示例项目,很酷的是它会为您创建所有的测试,包括使用devise进行视图测试。然后您可以从这些测试规范中获得想法。

对我有用 :D

希望能帮到您


这是一个很酷的工具!但是...它不会生成视图规范,只会生成控制器/模型规范。谢谢。 - SingleShot
啊,是的,但它提供了黄瓜(Cucumber)作为视图测试工具。在我个人看来,Cucumber是进行视图测试的理想工具。 - sameera207
我仍在学习如何使用BDD/TDD开发Rails应用程序,我正在使用的书籍(The RSpec Book)推荐使用Cucumber进行高级别测试,但也深入研究RSpec进行详细的控制器、模型和视图测试。由于我找不到任何使用Devise进行视图规范的RSpec示例,所以我可能需要放弃视图规范。 - SingleShot
我还没有看到使用Cucumber而不是RSpec进行集成测试的好理由(“它是用英语编写的,有点像”算是一个很大的反理由)。更不用说你将不得不在你的Cucumber代码中插入处理身份验证和其他重要内容的代码了,对吧? - Jeff Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接