ruby-on-railsrspecrspec-railscontroller-tests

wrong number of arguments error while testing comments controller using Rspec


While Testing Comments Controller, I get this error while creating a comment.

Failures:

  1) CommentsController Valid POST create creates a new comment
     Failure/Error: post :create, params: { comment: { content: 'TestCommentContent' }, topic_id: topic.id, post_id: post.id }

     ArgumentError:
       wrong number of arguments (given 2, expected 0)
     # ./spec/controllers/comments_controller_spec.rb:10:in `block (5 levels) in <top (required)>'
     # ./spec/controllers/comments_controller_spec.rb:9:in `block (4 levels) in <top (required)>'

Finished in 0.15835 seconds (files took 13.89 seconds to load)

This is my CommentsController rspec code:

require 'rails_helper'

RSpec.describe CommentsController, type: :controller do
  describe 'Valid' do
    let!(:topic) { Topic.create(title: 'test_Post_topic_title', name: 'test_Post_topic_name') }
    let!(:post) { Post.create(title: "TestPostTitle1", content: "TestPostContent1", topic_id: topic.id) }
    context 'POST create' do
      it 'creates a new comment' do
        expect do
          post :create, params: { comment: { content: 'TestCommentContent' }, topic_id: topic.id, post_id: post.id }
        end.to change(Comment, :count).by(1)
        expect(assigns(:comment).content).to eql "'TestCommentContent"
        expect(flash[:notice]).to match('Comment was successfully created.')
        expect(response).to redirect_to "/topics/#{assigns(:topic).id}/posts/#{assigns(:post).id}"
        expect(response).to have_http_status(:found) #302
      end
    end
end

In the development environment when I create a comment this is the log that has been created:

Started POST "/topics/3/posts/12/comments" for ::1 at 2021-05-13 14:01:49 +0530
Processing by CommentsController#create as HTML
  Parameters: {"authenticity_token"=>"[FILTERED]", "comment"=>{"content"=>"Yummy!!"}, "commit"=>"Create Comment", "topic_id"=>"3", "post_id"=>"12"}
  Topic Load (0.4ms)  SELECT "topics".* FROM "topics" WHERE "topics"."id" = ? LIMIT ?  [["id", 3], ["LIMIT", 1]]
  ↳ app/controllers/comments_controller.rb:59:in `get_topic_id'
  Post Load (0.5ms)  SELECT "posts".* FROM "posts" WHERE "posts"."id" = ? LIMIT ?  [["id", 12], ["LIMIT", 1]]
  ↳ app/controllers/comments_controller.rb:63:in `get_post_id'
  TRANSACTION (0.1ms)  begin transaction
  ↳ app/controllers/comments_controller.rb:8:in `create'
  Comment Create (112.8ms)  INSERT INTO "comments" ("post_id", "content", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["post_id", 12], ["content", "Yummy!!"], ["cr
eated_at", "2021-05-13 08:31:49.791154"], ["updated_at", "2021-05-13 08:31:49.791154"]]
  ↳ app/controllers/comments_controller.rb:8:in `create'
  TRANSACTION (1191.9ms)  commit transaction
  ↳ app/controllers/comments_controller.rb:8:in `create'
Redirected to http://localhost:3000/posts/12
Completed 302 Found in 1354ms (ActiveRecord: 1305.7ms | Allocations: 4639)

I have to send 3 parameters for this but it says that expected arguement is 0.?? how to resolve this. Thanks in Advance...!!!


Solution

  • You have defined post with let! which shadows the post method for sending request. Come up with another name for it.