私は既存のプロジェクトの仕様書を書くことでRSpecを学んでいます。私は多型リソースのコントローラ仕様に問題があります。事実上、他のどのモデルも、次のようなNotesとの関係を持つことができます。has_many :notes, as: :noteable
RSpec:ポリモーフィックリソースのコントローラスペック、 "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
ありがとうございます、あなたは何かをしているようです。ルーティングエラーはなくなりましたが、現在は 'TypeError:classまたはmodule required'と表示されます。私はそれがCustomerクラスを参照していると思います。それをテストにどのように組み込むのですか? – GreyEyes
あなたはエラーのためにいくつかのstacktraceを与えることができますか?それは助けるべきである。 –
より良い書式設定のために問題にしてください。 –