Reputation: 862
When i has added devise module to my rails application my tests thwors error
73) Error:
test_should_update_task(TasksControllerTest):
ActionView::Template::Error: undefined method `authenticate' for nil:NilClass
/home/razor/.gem/ruby/1.9.1/gems/devise-2.1.2/lib/devise/controllers/helpers.rb:56:in `current_user'
/home/razor/.gem/ruby/1.9.1/gems/devise-2.1.2/lib/devise/controllers/helpers.rb:52:in `user_signed_in?'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/abstract_controller/helpers.rb:53:in `user_signed_in?'
/home/razor/work/judgement/app/views/layouts/application.html.erb:11:in `_app_views_layouts_application_html_erb___67557477041607610_29516700'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/template.rb:145:in `block in render'
/home/razor/.gem/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications.rb:123:in `block in instrument'
/home/razor/.gem/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications/instrumenter.rb:20:in `instrument'
/home/razor/.gem/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/notifications.rb:123:in `instrument'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/template.rb:143:in `render'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/renderer/template_renderer.rb:59:in `render_with_layout'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/renderer/template_renderer.rb:45:in `render_template'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/renderer/template_renderer.rb:18:in `render'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/renderer/renderer.rb:36:in `render_template'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_view/renderer/renderer.rb:17:in `render'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/abstract_controller/rendering.rb:110:in `_render_template'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_controller/metal/streaming.rb:225:in `_render_template'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/abstract_controller/rendering.rb:103:in `render_to_body'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_controller/metal/renderers.rb:28:in `render_to_body'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_controller/metal/compatibility.rb:50:in `render_to_body'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/abstract_controller/rendering.rb:88:in `render'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_controller/metal/rendering.rb:16:in `render'
/home/razor/.gem/ruby/1.9.1/gems/actionpack-3.2.6/lib/action_controller/metal/instrumentation.rb:40:in `block (2 levels) in render'
/home/razor/.gem/ruby/1.9.1/gems/activesupport-3.2.6/lib/active_support/core_ext/benchmark.rb:5:in `block in ms'
93 tests, 36 assertions, 0 failures, 73 errors, 0 skips
Errors running test:functionals! #<RuntimeError: Command failed with status (73): [/usr/bin/ruby19 -I"lib:test" -I"/usr/lib64...]>
where the application.html.erb is
<!DOCTYPE html>
<html>
<head>
<title>Judgement</title>
<%= stylesheet_link_tag "application", :media => "all" %>
<%= javascript_include_tag "application" %>
<%= csrf_meta_tags %>
</head>
<body>
<nav>
<% if user_signed_in? then %>
<%= link_to "You are #{current_user.email}", edit_user_registration_path %>
<%= link_to "Exit", destroy_user_session_path, { :method => :delete,
:confirm => "Are you sure"} %>
<% else %>
<%= link_to "Sign In", new_user_session_path %>
<%= link_to "Register", new_user_registration_path %>
<% end %>
</nav>
<%= yield %>
<div class="notice">
<%= notice %>
</div>
<div class="alert">
<%= alert %>
</div>
</body>
</html>
So this looks like error because "user_signed_in?" helper. But i can not understand what is the point of error.
I am not very familiar with all Rails magic.
UPD: SOLVED
I was must to add
class ActionController::TestCase
include Devise::TestHelpers
end
to my test/test_helper.rb
Upvotes: 4
Views: 1188
Reputation: 894
If you're using this for view specs in rspec, you'll want to stub it on view
, not helper
.
allow(view).to receive(:user_signed_in?).and_return(true)
Upvotes: 0
Reputation: 7240
I suggest to use this functions : https://gist.github.com/989413. Your tests will be more isolated. In your can, you can just stub like this : helper.stub(:user_signed_in?) {false}
. The function user_signed_in? should return true or false as you want.
There is a similare question here : Testing helpers in Rails 3 with Rspec 2 and Devise
Edit for Test::Unit
It think you should redefine a method to mock with Test::Unit. Something like this :
module Devise
module Controllers
module Helpers
def user_signed_in?
true #Return false if you want
end
end
end
end
Upvotes: 1