巫术鉴定宝石:https://github.com/NoamB/sorcery
Sorcery的创建者提供了一个示例Rails应用程序,其Test::Unit功能测试中包含Sorcery测试帮助程序:https://github.com/NoamB/sorcery-example-app/blob/master/test/functional/users_controller_test.rb
# Test::Unit functional test example
require 'test_helper'
class UsersControllerTest < ActionController::TestCase
setup do
@user = users(:noam)
end
test "should show user" do
login_user
get :show, :id => @user.to_param
assert_response :success
end
但是我不知道如何让login_user
在我的RSpec控制器规范中工作。
/gems/sorcery-0.7.5/lib/sorcery/test_helpers/rails.rb:7:in `login_user':
undefined method `auto_login' for nil:NilClass (NoMethodError)
以下是Sorcery gem中关于上述错误的相关代码:https://github.com/NoamB/sorcery/blob/master/lib/sorcery/test_helpers/rails.rb
module Sorcery
module TestHelpers
module Rails
# logins a user and calls all callbacks
def login_user(user = nil)
user ||= @user
@controller.send(:auto_login,user)
@controller.send(:after_login!,user,[user.send(user.sorcery_config.username_attribute_names.first),'secret'])
end
def logout_user
@controller.send(:logout)
end
end
end
end
更新:
根据Sorcery的文档“Testing in Rails 3”,我确实将include Sorcery::TestHelpers::Rails
添加到了我的spec_helper.rb
中。
巫术测试助手login_user
作用于@controller
,但我得到了错误,因为在我的控制器规范中@controller
是nil
。下面是我的规范:
#spec/controllers/forums_controller_spec.rb
require 'spec_helper'
describe ForumsController do
render_views
describe 'GET new' do
describe 'when guest' do
it 'should deny and redirect' do
get :new
response.should redirect_to(root_path)
end
end
describe 'when admin' do
p @controller #=> nil
@user = User.create!(username: "Test", password: "secret", email: "test@test.com")
login_user # <--------------- where the error occurs
it 'should resolve' do
get :new
response.should render_template(:new)
end
end
end
end
5条答案
按热度按时间aij0ehis1#
FWIW,我花了很多时间寻找这个问题的答案。我正在使用水豚和rSpec。事实证明,你需要手动登录到使用巫术才能让登录工作。
我在这里创建了一个关于使用Sorcery/Rspec/Capybara创建集成测试的Gist:https://gist.github.com/2359120/9989c14af19a48ba726240d030c414b882b96a8a
iqxoj9l92#
您需要在spec_helper中包含Sorcery测试助手
参见魔法wiki:https://github.com/NoamB/sorcery/wiki/Testing-rails-3
在示例rails应用程序中,这是在www.example.com上完成https://github.com/NoamB/sorcery-example-app/blob/master/test/test_helper.rb#L13
更新
你在同一个文件夹中是否有其他的控制器规格成功通过?RSpec通常会在“spec/controllers”文件夹中混合控制器测试所需的东西。
您可以尝试通过编写以下代码将其显式标记为控制器规范
h9a6wy2h3#
你需要把你的用户创建和登录放在before(:each)块中,如下所示:
68bkxrlz4#
对于Rails 7.0.0中的新应用程序,我通过添加以下内容修复了此问题:
然后我可以使用魔法中的方法,而不需要定义我自己的方法:
只添加::Sorcery::TestHelpers::Rails无法找到login_user方法。
希望这能帮上忙。
jpfvwuh45#
我自己刚刚经历了这个困境,并从danneu,diwalak和Birdlevitator的输入中汲取了经验(在此标题中:rail3/rspec/devise: rspec controller test fails unless I add a dummy=subject.current_user.inspect)我想我能看到一个解决方案。
我一直在使用一个标准的rails 3 rspec生成的资源,它是通过'rails generate scaffold'命令生成的。下面是我修改后的控制器rspec文件,它可以使用魔法登录:
下面是一些重要的部分:
这一步完成了编程式登录(忽略名字和姓氏属性,它们是我正在构建的解决方案所特有的):
此位保存会话信息/密钥数据:
正如diwalak所写的,我们需要将以下内容添加到spec_help.rb文件中:
就这样--反正对我很有效:)