创建一个后控制器规范测试

时间:2015-01-30 01:08:40

标签: ruby-on-rails ruby testing rspec controller

我正在进行控制器测试,但似乎spec.rb是错误的。 你有什么建议吗?

这是我的posts_controller.rb

class PostsController < ApplicationController

 def create
    @post = Post.new(post_params)
    if @post.save
      redirect_to @wall
    end
 end

 def destroy
    @post.destroy
  end 
  private
   def post_params
    params.require(:post).permit(:wall, :content)
   end
 end

这是我的posts_controller_spec.rb

require 'rails_helper'

describe PostsController do
  let(:wall) { create(:wall) }

  describe "#create" do
      it "saves the new post in the wall" do
      post :create, { wall_id: wall, content: "Some text I would like to put in my post" } 
      end
  end

  describe "#destroy" do
    it "deletes the post in the wall" do
    end
  end
end
你能帮我纠正一下我的spec.rb吗? 这是我的错误:

PostsController   #创建     将新帖子保存在墙上(FAILED - 1)   #破坏     删除墙上的帖子

故障:

1)PostsController #create将新帖子保存在墙上      失败/错误:帖子:创建,发布:{墙:墙,内容:“我希望在我的帖子中添加一些文字”}      ActiveRecord的:: AssociationTypeMismatch:        墙(#2159949860)预计,得到字符串(#2155957040)      #./app/controllers/posts_controller.rb:3:in create' # ./spec/controllers/posts_controller_spec.rb:8:in阻止(3级)'      #-e:1:在''

以0.9743秒结束(文件加载时间为3.94秒) 2个例子,1个失败

失败的例子:

rspec ./spec/controllers/posts_controller_spec.rb:7#PostsController #create将新帖保存在墙上

提前谢谢

2 个答案:

答案 0 :(得分:1)

您的规范并未包含任何期望,因此它的错误&#34;从这个意义上说。我建议你google&#34; RSpec期望&#34;和/或阅读文档(即https://relishapp.com/rspec/rspec-expectations/docs)。

至于您在评论中提到的错误,这反映了您的生产代码存在问题(即,在案例中缺少redirectrender或某些create模板@post.save返回nil)。再次,谷歌搜索错误应该产生信息,以帮助您解决此问题,或者您可以阅读http://guides.rubyonrails.org/layouts_and_rendering.html。如果您完全是Rails的新手,我建议您按照其中一个教程进行操作,例如https://www.railstutorial.org/

您还应该更新您的问题以包含该错误信息,因为它具有高度相关性,如果没有它,问题基本上是不完整的。

答案 1 :(得分:0)

你应该期待一些测试。例如,你可以这样做:

RSpec.describe PostsController, type: :controller do
  let!(:wall) { create(:wall) } 
  let(:test_post) {
      create(:post, wall_id: wall.id, content: "Something") }
  }

  describe "POST #create" do
    let(:post) { assigns(:post) }
    let(:test_wall) { create(:wall) }

    context "when valid" do
      before(:each) do
        post :create, params: {
          post: attributes_for(:post, wall_id: test_wall.id, content: "Anything")
        }
      end

      it "should save the post" do
        expect(post).to be_persisted
      end

    end
  end
end

这样,当您发布参数时,您期望从rails获得响应。我只编写了测试的后期部分。