开发者

Rails belongs_to testing

开发者 https://www.devze.com 2022-12-21 17:49 出处:网络
I have a Proposal model that belongs to Project: class Proposal < ActiveRecord::Base belongs_to :project

I have a Proposal model that belongs to Project:

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

The route I set up to show this record is "http://domain.tld/projects/project-id/proposal", through this line in routes.rb - "map.resources :projects, :has_one => :proposal"

Now I want to test this through proposals_controller_test.rb.

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

However, "rake test" keeps telling me this, and I have no idea how to fix it. Probably really easy for you guys, but new to me.

  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'

Here is my controller show logic:

  # 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

A quick trip to "script/console" yields:

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

Whereas "script/console test" shows:

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

What is up with that wacky ID?!?! Please help me hook up associations in the test env!


Here is what was wrong.

Automatic associations in ruby on rails fixtures

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

  • See the section on "Label references for associations (belongs_to, has_one, has_many)"

Here is another optional explanation...


Essentially, you have to monkey around with your fixtures some and remove the _id from foreign keys to get associations working (oddly enough). The articles explain everything. After I RTFM everything starting working perfectly. Just needed to know where to look. Don't forget to "rake db:test:prepare" & "rake test" first!


First I thing noticed is that your controller is using the param 'project_id' and your test is passing a parameter of 'id'. So your find call will be searching with 'nil' in the controller which will probably cause the error your seeing.

Params is just a hash, and you can actually pass the params hash in your show call. If you want there to be a value for a 'project_id' field, then you can add that in easily. for example:

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

try something along those lines and you should be able to get the right project_id to the controller. Rails should know that the hash being passed at the end is the params hash and will create it for your controllers accordingly.

0

精彩评论

暂无评论...
验证码 换一张
取 消