Rspecの新機能で、コードベースをRails 3.0.xからRails 3.1.xに移行し、同時にテストを追加しています。私は基本的なコントローラーテストを実行することができましたが、Deviseの統合を開始した後、問題にぶつかり始めました。具体的には、に属するUser
というDeviseオブジェクトがあり、Company
には多くのCommunities
があります。コントローラCommunities
のテストを記述しようとしていますが、アソシエーション(たとえばcontroller.current_user.communities
)で参照しようとすると、作成したFactoryオブジェクトを参照できません。私は、次の(または類似の)エラーを取得をテストしようとすると:Rspec + Devise + Factory Girl Testing with Associations
No route matches {:id=>nil, :controller=>"communities", :action=>"edit"}
私はRSpecの/ Factory_Girlへの基本的な関連何かが欠けていると確信しているが、任意の助けもいただければ幸いです。次のように
Communities
ためedit
作用を試験するためのセットアップの一例は次のとおり
/config/routes.rb
Units::Application.routes.draw do
devise_for :users
resources :companies
resources :communities
...
root :to => 'companies#index'
end
/app/models/user.rb
class User < ActiveRecord::Base
belongs_to :company
has_many :communities, :through => :company
...
end
/app/models/company.rb
class Company < ActiveRecord::Base
has_many :users
has_many :communities
...
end
/app/models/community.rb
class Community < ActiveRecord::Base
belongs_to :company
...
end
/spec/controllers/communities_controller_spec.rb
require 'spec_helper'
describe CommunitiesController do
render_views
login_user
...
context "GET #edit" do
before(:each) do
@company = controller.current_user.company
@community = controller.current_user.communities.new[Factory.build(:community, :company => @company)]
controller.current_user.company.communities.should_receive(:find).with(:company => @company)
end
it "should be successful" do
get :edit, :id => @community
response.should be_successful
end
it "should find a specific community" do
get :edit, :id => @community
assigns(:community).should eq(@community)
end
end
...
end
/app/controllers/communities_controller.rb
class CommunitiesController < ApplicationController
...
def edit
@community = current_user.communities.find(params[:id])
end
...
end
/spec/support/controller_macros.rb
module ControllerMacros
def login_user
before(:each) do
@request.env["devise.mapping"] = Devise.mappings[:user]
company = Factory.create(:company)
user = Factory.create(:user, :company => company)
# user.confirm! # or set a confirmed_at inside the factory. Only necessary if you are using the confirmable module
sign_in user
end
end
end
'config/routes.rb'を追加してください。 – lucapette
' 'それは成功するはずです' 'セクションに' p @ community'を追加して、結果を教えてください。 – farnoy
@farnoy私は 'p @ community'をそのセクションに入れましたが、出力を変更しませんでした。私はまだ次のエラーが発生しています: 'Failure/Error:get:edit、:id => @community ActionController :: RoutingError: ルートが一致しません。{:id => nil、:controller = 、:action => "edit"} ' – theandym