如何编写没有质量分配的rspec控制器规范model_mock

时间:2011-03-30 01:31:21

标签: ruby-on-rails-3 rspec2

我正在使用rspec来测试使用声明了attr_accessible的模型的控制器。我不想测试attr_accesible是否正常工作(我的模型规范确实如此),但我确实想确保我的控制器没有进行批量分配。

具体来说,我有一个这样的模型:

class Post < ActiveRecord::Base
  attr_accessible :body
  validates :body,    :presence => true,
  validates :user,    :presence => true
  belongs_to :user
end

并稍微调整生成的控制器(删除了xml格式行):

  def create
    # this line keeps the rspec test mock happy
    @post = Post.new(params[:post].merge(:user => current_user))

    # Below are the correct lines of code for runtime for attr_accessible
    # @post = Post.new(params[:post])
    # @post.user = current_user            

    respond_to do |format|
      if @post.save
        format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
      else
        format.html { render :action => "new" }
      end
    end
  end

我有一个带有上面的模拟控制器的rspec测试:

describe "POST create" do
  describe "with valid params" do
    it "assigns a newly created post as @post" do
      Post.stub(:new).
        with({'body' => 'hi there', 'user' => @user}) { mock_post(:save => true) }
      post :create, :post => {'body' => 'hi there'}
      assigns(:post).should be(mock_post)
    end
  end
end

我想要做的是更改rspec测试,以便在我注释掉第一个@post行并取消注释以下两个@post行时正确验证控制器。这样,我将验证控制器将与真实模型一起正常工作,但我可以继续使用模拟进行测试。我已经尝试了几种方法,并且似乎是在圈子中进行(是的,我是Rails和Rspect的新手:p)

非常感谢提前!

1 个答案:

答案 0 :(得分:3)

检查质量分配。你需要复制它。所以在请求中发送错误的用户ID

post :create, :post => {'body' => 'hi there', 'user_id' => '2'}

然后确保您创建的帖子具有控制器分配的user_id(假设在此示例中其id不是2)

assigns(:post)user_id.should be(current_user.id)