0

私は既存のプロジェクトの仕様書を書くことでRSpecを学んでいます。私は多型リソースのコントローラ仕様に問題があります。事実上、他のどのモデルも、次のようなNotesとの関係を持つことができます。has_many :notes, as: :noteableRSpec:ポリモーフィックリソースのコントローラスペック、 "No route matches"エラー

さらに、このアプリケーションは複数テナントであり、各アカウントには多数のユーザーが参加できます。各アカウントは、URLに:idの代わりに:slugによってアクセスされます。だから私のmulit-テナントは、多型ルーティングは次のようになります。新しいアクションのテスト問題への今

new_customer_note GET /:slug/customers/:customer_id/notes/new(.:format)  accounts/notes#new 
new_product_note GET /:slug/products/:product_id/notes/new(.:format)  accounts/notes#new 

# config/routes.rb 
... 

scope ':slug', module: 'accounts' do 

    ... 

    resources :customers do 
    resources :notes 
    end 

    resources :products do 
    resources :notes 
    end 
end 

これがために、このようなルートになります。まず、ここで私はinvitations_controllerのような他の非多型コントローラをテストする方法の例です:

# from spec/controllers/accounts/invitation_controller_spec.rb 
require 'rails_helper' 

describe Accounts::InvitationsController do 
    describe 'creating and sending invitation' do 
    before :each do 
     @owner = create(:user) 
     sign_in @owner 
     @account = create(:account, owner: @owner) 
    end 

    describe 'GET #new' do 
     it "assigns a new Invitation to @invitation" do 
     get :new, slug: @account.slug 
     expect(assigns(:invitation)).to be_a_new(Invitation) 
     end 
    end 
    ... 
end 

私は多型notes_controllerをテストするために同様のアプローチを使用しようとすると、私は

# from spec/controllers/accounts/notes_controller_spec.rb 

require 'rails_helper' 

describe Accounts::NotesController do 
    before :each do 
    @owner = create(:user) 
    sign_in @owner 
    @account = create(:account, owner: @owner) 
    @noteable = create(:customer, account: @account) 
    end 

    describe 'GET #new' do 
    it 'assigns a new note to @note for the noteable object' do 
     get :new, slug: @account.slug, noteable: @noteable  # no idea how to fix this :-) 
     expect(:note).to be_a_new(:note) 
    end 
    end 
end 
:-)混乱

ここでは、前のブロックで顧客を@noteableとして作成していますが、これも製品であってもかまいません。私はRSpecの実行すると、私はこのエラーを取得:

No route matches {:action=>"new", :controller=>"accounts/notes", :noteable=>"1", :slug=>"nicolaswisozk"} 

私は問題が何であるかを見ますが、私はちょうど/products/または/customers/のように、URLの動的な部分に対処する方法を見つけ出すことはできません。

UPDATEが01​​

:-)すべてのヘルプは大歓迎です:

get :newラインを変更し

get :new, slug: @account.slug, customer_id: @noteable 

するには、以下の要求に応じて、これがエラーの原因

Failure/Error: expect(:note).to be_a_new(:note) 

TypeError: 
    class or module required 
# ./spec/controllers/accounts/notes_controller_spec.rb:16:in `block (3 levels) in <top (required)>' 

speの16行目Cは次のとおりです。

expect(:note).to be_a_new(:note) 

ので、これは次のようになります。これは

def new 
    @noteable = find_noteable 
    @note = @noteable.notes.new 
end 

答えて

2
を?:ように私のnotes_controller.rbの新しいアクションが、ちょうど @note = Note.newではなく、@noteableに新しいノートを初期化しています

さてここで問題が

get :new, slug: @account.slug, noteable: @noteable 

この行では、あなたがのparamsで:noteableを渡していることをする必要があります。しかし、代わりにレールのすべての動的部分を渡す必要があります。ここでは:customer_idをparamsに渡す必要があります。このように、

get :new, slug: @account.slug, customer_id: @noteable.id 

これが役立つかどうかお知らせください。

+0

ありがとうございます、あなたは何かをしているようです。ルーティングエラーはなくなりましたが、現在は 'TypeError:classまたはmodule required'と表示されます。私はそれがCustomerクラスを参照していると思います。それをテストにどのように組み込むのですか? – GreyEyes

+0

あなたはエラーのためにいくつかのstacktraceを与えることができますか?それは助けるべきである。 –

+0

より良い書式設定のために問題にしてください。 –

関連する問題