コントローラーをテストして、許可された関係者だけが RSpec を使用して正しい子オブジェクトを表示できることを確認しようとしています。このエラーが発生しているため、何が間違っているのかわかりません。
ActiveRecord::RecordInvalid: Validation failed: Company can't be blank
Plan オブジェクトと Company オブジェクトがあります。ストアには多くの計画があります (害虫駆除会社を考えてみてください)。既知のシナリオが与えられた場合、会社の計画を取得できることをテストしたいと思います (1 つしかないと仮定します)。
プランは次のようになります。
class Plan < ActiveRecord::Base
before_save :default_values
# Validation
validates :amount, :presence => true
validates :company, :presence => true
# Plans belong to a particular company.
belongs_to :company, :autosave => true
scope :find_all_plans_for_company, lambda {
|company| where(:company_id => company.id)
}
# Other code ...
end
会社は次のようになります。
class Company < ActiveRecord::Base
validates :name, :presence => true
validates :phone1, :presence => true
validates_format_of :phone1, :phone2,
:with => /^[\(\)0-9\- \+\.]{10,20}$/,
:message => "Invalid phone number, must be 10 digits. e.g. - 415-555-1212",
:allow_blank => true,
:allow_nil => true
has_many :users
has_many :plans
end
..コントローラーはこんな感じ
def index
@plans = Plan.find_all_plans_for_company(current_user.company)
respond_to do |format|
format.html # index.html.erb
format.json { render json: @plans }
end
end
.. そして、私の RSpec テストは次のようになります (ギミックがいっぱいで申し訳ありません。私はそれをいじっているだけで、動作させることができません)。
describe PlansController do
def valid_attributes
{
:company_id => 1,
:amount => 1000
}
end
describe "GET index" do
it "should return the Plans for which this users company has" do
@company = mock_model(Company, :id => 1, :name => "Test Company", :phone1 => "555-121-1212")
Company.stub(:find).with(@company.id).and_return(@company)
controller.stub_chain(:current_user, :company).and_return(@company)
plan = Plan.create! valid_attributes
get :index, {}
assigns(:plans).should eq([plan])
end
# Other tests ...
end
end
問題は、これ(または私が試したクレイジーな他のバリアントのいずれか)を試すと、次のエラーが発生することです。
ActiveRecord::RecordInvalid: Validation failed: Company can't be blank
Company.stub
呼び出しでこれが処理されると思っていたので、なぜこれが起こっているのかわかりません。しかし、どうやらそうではありません。
ここで何が欠けていて、何が間違っていますか? どうすればこのテストに合格できますか?