【问题标题】:Rails belongs_to testingRails 属于_to 测试
【发布时间】:2011-01-22 02:13:12
【问题描述】:

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

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

【问题讨论】:

    标签: ruby-on-rails activerecord associations functional-testing


    【解决方案1】:

    这就是问题所在。

    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”!

    【讨论】:

    【解决方案2】:

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

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

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

    尝试这些方法,您应该能够为控制器获取正确的 project_id。 Rails 应该知道最后传递的哈希是 params 哈希,并将相应地为您的控制器创建它。

    【讨论】:

    • 我同意这可能是问题所在。因此“找不到没有 ID 的项目”。这是需要一些大师魔法的行 - “get :show, :id => proposal(:one).to_param”。
    • 基本上,我需要知道如何在功能测试中复制 params[] 并将其传递给我的控制器...
    • 更新了答案以显示如何在 params 哈希中传递项目 id 值。
    • 我从来没有意识到传递给 get 方法的哈希值可以替代 rails 路由等生成的所有参数。有道理...
    • 这一切都很好,但是关联在测试环境中的工作方式并不相同,因为我的灯具具有随机生成的 ID。这使我无法以传统的外键方式将它们关联在一起。我仍然需要帮助...
    猜你喜欢
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多