2

我有屬於項目制定方案的模型:的Rails belongs_to的測試

class Proposal < ActiveRecord::Base 
    belongs_to :project 
    has_many :articles, :as => :document, :dependent => :destroy 
    has_many :sections, :through => :articles 

    # proposal has project - test/unit/proposal_test.rb 
    validates_presence_of :project_id 
end 

我設置爲顯示此記錄的路線是「http://domain.tld/projects/project-id/proposal」,通過此行routes.rb中 - 「map.resources:項目,:has_one =>:建議「

現在我想通過proposals_controller_test.rb來測試它。

test "should show proposal" do 
    get :show, :id => proposals(:one).to_param 
    assert_response :success 
    end 

但是,「耙測試」一直告訴我這一點,我不知道如何解決它。對你們來說可能很容易,但對我來說是新的。

1) Error: 
test_should_show_proposal(ProposalsControllerTest): 
ActiveRecord::RecordNotFound: Couldn't find Project without an ID 
    app/controllers/proposals_controller.rb:18:in `show' 
    /test/functional/proposals_controller_test.rb:34:in `test_should_show_proposal' 

這裏是我的控制器顯示邏輯:

# should show proposal - test/functional/proposals_controller_test.rb 
    def show 
    @project = Project.find(params[:project_id]) 
    @proposal = @project.proposal 

    respond_to do |format| 
     format.html # show.html.erb 
     format.xml { render :xml => @proposal } 
    end 
    end 

快速去 「腳本/控制檯」 收益率:

Loading development environment (Rails 2.3.4) 
>> t = Project.first 
=> #<Project id: 1, name: "Test"> 
>> t.proposal 
=> #<Proposal id: 2, active: true, project_id: 1> 

而 「腳本/控制檯測試」 顯示:

Loading test environment (Rails 2.3.4) 
>> t = Project.first 
=> #<Project id: 298486374, name: "Test"> 
>> t.proposal 
=> nil 

這是怎麼回事古怪的ID?!?!請幫助我在測試環境中連接關聯!

回答

2

這是什麼錯了。

Automatic associations in ruby on rails fixtures

http://ar.rubyonrails.org/classes/Fixtures.html

  • 查看 「標籤引用了協會(belongs_to的,HAS_ONE,的has_many)」 部分

這裏是另一個optional explanation ...


本質上,你必須與你的燈具一起猴子一些,並從外鍵刪除_id讓協會工作(奇怪的是)。這些文章解釋了一切。在我RTFM之後,所有事情都開始順利運作。只需要知道去哪裏看。先別忘了「rake db:test:prepare」&「rake test」!

+0

更新鏈接,現在在http://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html。這非常有幫助,謝謝!首先看起來很直觀,可以通過名稱在燈具中設置關聯,但是當您考慮使用生成的ID時,這很有意義。 – Ethan 2015-05-20 13:04:39

0

首先我注意到的是,您的控制器正在使用param'project_id',並且您的測試正在傳遞'id'參數。因此,您的查找電話將在控制器中以'nil'搜索,這可能會導致您看到的錯誤。

Params只是一個散列,你可以在你的show調用中實際傳遞params散列。如果你想要有一個'project_id'字段的值,那麼你可以很容易地添加它。例如:

get :show, { :project_id => proposals(:one).project_id } 

嘗試沿着這些方向,您應該能夠將正確的project_id傳遞給控制器​​。 Rails應該知道最後傳遞的散列是params散列,並會相應地爲你的控制器創建它。

+0

我同意這可能是問題所在。因此「無法找到沒有ID的項目」。這是需要一些古魯神奇的線 - 「get:show,:id =>提案(:one).to_param」。 – 2010-02-28 20:41:22

+0

本質上,我需要知道如何在功能測試中複製params []並將其傳遞給我的控制器... – 2010-02-28 20:42:58

+0

更新了答案以顯示如何在params散列中傳遞項目id值。 – Pete 2010-02-28 20:57:29