2

我有一个属于项目的提案模型:

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 :projects, :has_one => :proposal”

现在我想通过proposals_controller_test.rb 来测试一下。

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

但是,“rake test”一直告诉我这个,我不知道如何解决它。对你们来说可能真的很容易,但对我来说是新的。

  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是怎么回事?!?!请帮我在测试环境中连接关联!

4

2 回答 2

2

这是错误的。

ruby on rails 固定装置中的自动关联

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

  • 请参阅“关联的标签引用(belongs_to、has_one、has_many)”部分

这是另一个可选的解释...


从本质上讲,您必须使用一些固定装置并从外键中删除 _id 才能使关联正常工作(很奇怪)。文章解释了一切。在我进行 RTFM 之后,一切都开始完美运行。只需要知道在哪里看。不要忘记先“rake db:test:prepare”和“rake test”!

于 2010-03-01T03:32:35.347 回答
0

首先我注意到的是您的控制器正在使用参数“project_id”并且您的测试正在传递“id”参数。因此,您的 find 调用将在控制器中使用“nil”进行搜索,这可能会导致您看到的错误。

Params 只是一个哈希值,您实际上可以在 show 调用中传递 params 哈希值。如果您希望“project_id”字段有一个值,那么您可以轻松添加它。例如:

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

尝试按照这些思路进行操作,您应该能够为控制器获取正确的 project_id。Rails 应该知道最后传递的哈希是 params 哈希,并将相应地为您的控制器创建它。

于 2010-02-28T20:36:29.070 回答