在rspec的控制器测试中使用rails的"post",并在路由上进行范围界定和协议



我有一个rails项目,在生产中运行出了基础url的子目录,我希望它在开发中以这种方式行事,以便使开发和生产尽可能接近。我把路由文件设置成这样:

Foo::Application.routes.draw do
    def draw_routes
        root :to=>'foo#home'
        resources :cats, :only=>[:create] do
    end
    if Rails.env.production?
        scope :protocol=>'http://' do
            draw_routes
        end
    else
        scope :path=>"/foo", :protocol=>'http://' do
            draw_routes
        end
    end
end

我的CatsController是这样的:

class CatsController < ApplicationController
    def create
        @cat = Cat.new(:name=>"Bob")
        if @cat.save()
            redirect_to root
        end
    end
end

我想测试我的Create Cat Method,所以我在spec/controllers/cats_controller_spec.rb中设置了一个rspec测试:

require 'spec_helper'
describe CatsController do
    describe "calling create cat with good data" do
        it "should add a cat" do
            expect {post(:action=>:create)}.to change(Cat, :count).by(1)
        end
    end 
end

当我运行测试时,我得到

Failure/Error: post :create
     ActionController::RoutingError:
       No route matches {:controller=>"cats", :action=>"create"}
     # ./spec/controllers/cats_controller_spec.rb:5:in `(root)'

Rake routes说我的路线在那里!这里到底发生了什么,为什么会失败?

Rake Routes:
    cats POST   /foo/cats(.:format)            cats#create {:protocol=>"http://"}

问题是:protocol的值有点不稳定。

更好的方法来解决这个问题,我认为,是设置协议在您的范围http而不是http://。如果你确实需要用一些时髦的协议来测试你的控制器,你应该能够这样做:

post(:action => :create, :protocol => 'funky')

对于rspec 3,下面的代码适用于我。

post :action, protocol: 'https://'

相关内容

  • 没有找到相关文章

最新更新