控制器规格中的参数数目错误(给定2,预期为0)

0 ruby rspec ruby-on-rails

我想检查创建动作是否通过。

 describe "#create" do
  let!(:user){ create(:user) }
  let!(:post){ create_list(:post, 3, user: user) }
    context "authenticated user" do
      it "adds a new post" do   
        post_params = FactoryBot.attributes_for(:post)
        sign_in user  
        expect{ post :create, params: {post: post_params} }.to change(user.posts, :count).by(1)
      end
    end
  end
Run Code Online (Sandbox Code Playgroud)

但我的错误是

Failure/Error: expect{ post :create, params: {post: post_params} }.to change(user.posts, :count).by(1)

     ArgumentError:
       wrong number of arguments (given 2, expected 0)
Run Code Online (Sandbox Code Playgroud)

posts_controller:

def create
    @post = Post.new(post_params)
    if params[:images]
      if @post.save
        params[:images].each do |img|
          @post.photos.create(image: img)
        end
      else
      end
      redirect_to posts_path
      flash[:notice] = "success"
    else
      redirect_to posts_path
      flash[:alert] = "failure"
    end
  end
Run Code Online (Sandbox Code Playgroud)

jvn*_*ill 5

这很可能是因为您正在使用的变量let!(:post)post :create, params: {post: post_params}post方法)冲突。

解决方案是更改let!(:post)为,let!(:posts)因为它仍然是列表。

  • @kodai这完美地回答了原始问题。您遇到了一个“ ArgumentError”,此答案说明了为什么以及如何克服它。为使测试通过而进行的修复完全超出了此问题的范围。请接受此答案,并在需要时询问其他问题。 (2认同)