2015-11-25 56 views
0

我想運行一個簡單的測試,檢查該對象可以與它的關聯建FactoryGirl並與協會

class Portfolio < ActiveRecord::Base 
    has_many :portfolio_sectors 
    has_many :sectors, through: :portfolio_sectors 
    has_many :portfolio_images, dependent: :destroy 
    accepts_nested_attributes_for :portfolio_images, allow_destroy: true 
end 

class Sector < ActiveRecord::Base 
    has_many :portfolio_sectors 
    has_many :portfolios, through: :portfolio_sectors 
end 

我的測試看起來像這樣

RSpec.describe Portfolio, type: :model do 
    it 'should have a valid Factory' do 
    expect(FactoryGirl.build(:portfolio)).to be_valid 
    end 
end 

投資組合的出廠檢測的has_many看起來像

include ActionDispatch::TestProcess 
FactoryGirl.define do 
    factory :portfolio do |p| 
    p.title 'Test portfolio title' 
    p.overview 'test sentence for the overview section of portfolio' 
    p.url 'http://bbc.co.uk' 
    p.after(:create) do |portfolio| 
     portfolio.sectors = FactoryGirl.create(:associated_sector, portfolio: portfolio) 
    end 
    p.after(:create) do |portfolio| 
    portfolio.portfolio_images = [FactoryGirl.build(:portfolio_image, portfolio: portfolio)] 
    end 
end 
end 

因此,當這個測試運行我得到

Failure/Error: expect(FactoryGirl.build(:portfolio)).to be_valid 
expected #<Portfolio id: nil, 
      overview: "test sentence for the overview section of portfoli...", 
      title: "Test portfolio title", 
      sector_id: nil, 
      url: "http://bbc.co.uk", 
      created_at: nil, 
      updated_at: nil> 
to be valid, but got errors: Sectors Choose At Least 1 Sector 

我可以看到爲什麼沒有扇區ID存在。

如何在創建投資組合時通過部門ID?

或者我不正確地接近?

感謝

回答

0

您重新定義create回調位置:

p.after(:create) do |portfolio| 
    portfolio.sectors = FactoryGirl.create(:associated_sector, portfolio: portfolio) 
end 
p.after(:create) do |portfolio| 
    portfolio.portfolio_images = [FactoryGirl.build(:portfolio_image, portfolio: portfolio)] 
end 

有沒有神奇的,第二個重新定義了第一個。使用後續調用:

p.after(:create) do |portfolio| 
    portfolio.sectors = FactoryGirl.create(:associated_sector, portfolio: portfolio) 
    portfolio.portfolio_images = [FactoryGirl.build(:portfolio_image, portfolio: portfolio)] 
    portfolio.save! 
end 
+0

謝謝您的回答,雖然它類似於我有什麼(除了創建之後組合,十分感謝那個),我仍然得到一個錯誤'但是有錯誤:部門選擇在最少1個扇區「。例如,當用戶創建一個投資組合時,他們將從下拉列表中選擇數據庫中的部門列表,這是否有所作爲? – Richlewis

+0

嘗試在(:create)'回調之後的'end'中添加'portfolio.save!'。這聽起來像變化不傳播。另外,檢查前的'portfolio.reload'可能會有所幫助。 – mudasobwa

+0

不幸的是,這並沒有幫助,也沒有重新加載..要以不同的角度來看待這個問題,那麼,你會如何編寫這個測試?也許我可以從你那裏學習一些東西,也許改變我的方法,謝謝 – Richlewis