【发布时间】:2012-01-12 10:42:14
【问题描述】:
这是我的小问题,让我觉得自己很愚蠢。我正在使用 RSpec 测试我的 rails 应用程序,并且我还有设计控制器助手(从 Devise wiki 中获取,注意 user 默认参数):
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
这让我很困惑,因为我只传递了一个(nil)参数。我很高兴听到任何建议,因为这两个电话对我来说看起来一样。也许我错过了什么。
更新:
- Rails 3.1.0
- ruby 1.9.3p0(2011-10-30 修订版 33570)
- RSpec 2.7.1
更新 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)>'
【问题讨论】:
-
你能发布完整的错误信息吗?
-
来自设计 wiki -“在撰写本文时,没有任何 gem 版本的 rspec-mocks 不支持 throw 参数,因此您需要同时使用 git 存储库(与 rspec 和rspec-rails 2.8.0.rc1)。” RSpec 2.8.0 前几天发布了
标签: ruby-on-rails ruby rspec devise