这是我的小问题让我感到愚蠢。我正在用RSpec测试我的rails应用程序,我也设计了控制器助手(从Devise wiki中获取,注意用户默认参数):
module ControllerMacros
module ControllerHelpers
def sign_in(user=mock_model(User))
if user.nil?
request.env['warden'].stub(:authenticate!).
and_throw(:warden, {:scope => :user})
controller.stub :current_user => nil
else
# Lots of user.stub here
controller.stub :current_user => user
end
end
end
RSpec.configure do |config|
config.include Devise::TestHelpers, :type => :controller
config.include ControllerHelpers, :type => :controller
end
end
现在,当我在控制器测试的一个上下文中使用 sign_in 时,一切正常:
context "Authorized access" do
before(:each) do
mocked_user = mock_model(User)
mocked_user.stub(:is?).with(:admin).and_return(true)
sign_in(mocked_user)
# some checks
end
end
但是在另一个背景下(在相同的规范中)我得到“错误的参数数量(2对1)”:
context "Unauthorized access" do
before(:each) do
sign_in(nil)
end
# test cases
end
这对我来说相当混乱,因为我只传递了一个(零)参数。我很高兴听到任何建议,因为这两个电话看起来对我来说都是一样的。也许我错过了什么。
更新:
更新2(错误示例):
Failure/Error: sign_in(nil)
ArgumentError:
wrong number of arguments (2 for 1)
# ./spec/support/controller_macros.rb:5:in `sign_in'
# ./spec/controllers/forum/topics_controller_spec.rb:93:in `block (3 levels) in <top (required)>'
答案 0 :(得分:2)
错误将来自
行request.env['warden'].stub(:authenticate!).and_throw(:warden, {:scope => :user})
低于2.8的RSpec版本不支持and_throw
的参数。更新Gemfile以使用RSpec 2.8.0并告诉我你是如何继续的。
我记得我使用了一种更简单的控制器测试方法
before do
controller.stub(:authenticate!).and_return(mock_model('user'))
end
这样你完全绕过了Devise,经过了充分的测试