我試圖測試控制器,以確保只有被授權方可以使用RSpec的查看正確的子對象RSpec的檢查控制。我無法弄清楚我在做什麼錯了,因爲我得到這個錯誤:與Model.create
ActiveRecord::RecordInvalid: Validation failed: Company can't be blank
我有一個計劃目標和公司目標。該商店可以有很多計劃(想想一個害蟲控制公司)。我想測試一下,如果已知場景,我可以檢索公司的計劃(假設只有一個)。
的計劃是這樣的:
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
電話會爲我處理這個問題。但顯然不是。
缺少什麼我在這裏和我究竟做錯了什麼?我怎樣才能通過這個測試?
你能後的控制器代碼呢? – 2012-08-03 23:29:39
@shioyama - 已添加控制器。 – 2012-08-04 01:27:06
對不起,我現在意識到問題發生在'get:index,{}'之前,所以控制器代碼並不重要。 – 2012-08-04 02:24:54