测试属于Rails中帖子的注释的控制器

时间:2013-06-09 15:35:42

标签: ruby-on-rails ruby ruby-on-rails-3 testing

我对Rails很新,而且我对Ruby的了解也非常生疏。无论如何,我正试图用正确的测试覆盖率以正确的方式编写我的第一个Rails应用程序。我一直在尝试按照getting started指南并将其与testing指南相结合来完成此操作。 (为什么这两件事没合并!?)

所以,现在我一直试图测试向Comments控制器添加方法:

class CommentsController < ApplicationController
  def create
    @post = Post.find(params[:post_id])
    @comment = @post.comments.create(params[:comment])
    redirect_to post_path(@post)
  end
end

这是我的测试结果:

class CommentsControllerTest < ActionController::TestCase  
  setup do
    @comment = comments(:one)
  end
  test "should create comment" do
    assert_difference('Comment.count') do
      post :create, comment: { body: @comment.body, commenter: @comment.commenter, ???? }
    end

    assert_redirected_to post_path(assigns(:post)) #???? 
  end
end

使用此灯具

one:
  commenter: mystring
  body: mytext
  post: 

two:
  commenter: mystring
  body: mytext
  post: 

我的问题是我没有看到如何以惯用的Rails方式创建和引用Post作为评论的父级。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

您需要向创建请求添加参数post_id(控制器中的行post_id使用此@post = Post.find(params[:post_id]))。例如:

class CommentsControllerTest < ActionController::TestCase  

  setup do
    @comment = comments(:one)
    @post = posts(:post_one)
  end

  test "should create comment" do
    assert_difference('Comment.count') do
      post :create, comment: { body: @comment.body, commenter: @comment.commenter }, post_id: @post.id
    end    
    assert_redirected_to post_path(assigns(:post))
  end

end

此代码假设您已在灯具中定义了Post标识的:post_one