3

本番環境でベース URL のサブディレクトリが不足している Rails プロジェクトがあり、dev と prod をできるだけ近づけるために、dev でそのように動作させたいと考えています。次のようにルートファイルを設定しています。

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 メソッドをテストしたいので、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://"}
4

2 に答える 2

3

問題は、 の値が:protocol少し不安定なことです。

httpこれを修正するより良い方法は、スコープ内のプロトコルをではなく に設定することだと思いますhttp://。ただし、ファンキーなプロトコルでコントローラーをテストする必要がある場合は、次のことができるはずです。

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

またはあなたのプロトコルが何であれ。

于 2013-04-09T21:41:00.250 に答える
0

rspec 3の場合、これは私にとってはうまくいきます。

post :action, protocol: 'https://'
于 2015-02-06T08:23:45.400 に答える