gpt4 book ai didi

ruby-on-rails - 测试 Rail 的路线 :constraints lambda with RSpec 2

转载 作者:行者123 更新时间:2023-12-04 06:26:01 24 4
gpt4 key购买 nike

问题 :

您如何设置/模拟 rspec 路由测试以使其看起来更像生产机架环境?

能够首先调用 Controller 的身份验证功能的奖励积分(例如 ApplicationController.authenticate_user 设置 session [:current_user_id]

详情 :

我正在使用 route :constraints 将 www.example.com/路由到两个不同的 Controller 和 View ,具体取决于用户是否登录。

root :to => 'intentions#latest', :constraints => lambda {|r| r.env['rack.session'].has_key?(:current_user_id) }
root :to => 'welcome#index'

我想确保这一点脆弱的路由对其进行了适当的测试。杯子正在测试它,但我想做更深入的测试,特别是当我搞砸了 :current_user_id 而杯子没有捕捉到这一点时。例如,我在 ApplicationController 的 authenticate_user() 方法中使用了 :current_user_id。很想在 before(:each) 中调用它,并确保我设置了正确的 session key 。

所以我创建了一个名为/spec/routing/auth_routing_spec.rb 的文件,并尝试按照 http://relishapp.com/rspec/rspec-rails/v/2-6-rc/dir/routing-specs 上的指南进行操作。 .我创建了以下规范:
it "/ should send me to home page" do
get('/').should route_to(:controller => :index)
end

当我运行规范时,我在具有 :constraint 的路线上遇到了这个错误。我假设 env['rack.session'] 不存在。我试图通过 Rails.application.call(Rack::MockRequest.env_for('/')) 模拟出请求对象但这并没有帮助。
Failure/Error: get('/').should route_to(:controller => :index)
NoMethodError:
undefined method `has_key?' for nil:NilClass

无聊的应用细节
rake about产量
Ruby version              1.9.2 (x86_64-darwin10.6.0)
RubyGems version 1.6.2
Rack version 1.2
Rails version 3.0.7
Active Record version 3.0.7
Action Pack version 3.0.7
Active Resource version 3.0.7
Action Mailer version 3.0.7
Active Support version 3.0.7
grep rspec gemfile.info产量
remote: git://github.com/rspec/rspec-rails.git
rspec-rails (2.6.0.rc6)
rspec (= 2.6.0.rc6)
rspec (2.6.0.rc6)
rspec-core (= 2.6.0.rc6)
rspec-expectations (= 2.6.0.rc6)
rspec-mocks (= 2.6.0.rc6)
rspec-core (2.6.0.rc6)
rspec-expectations (2.6.0.rc6)
rspec-mocks (2.6.0.rc6)
rspec-rails!

最佳答案

我在我的 Controller 规范中做了类似的事情,也许同样的方法可以在这里工作?

describe "some controller" do
it "does something" do
request.stub(:env => {'rack.session' => {'current_user' => '42'})
get :my_action
response.should be_cool
end
end

经过反射(reflection),对您来说更好的方法可能是:
class CurrentUserConstraint
def self.matches?(request)
request.session[:current_user_id].present?
end
end

和:
root :to => 'intentions#latest', :constraints => CurrentUserConstraint.new

然后你的逻辑在一个易于测试的类中。

关于ruby-on-rails - 测试 Rail 的路线 :constraints lambda with RSpec 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5955469/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com