Rspec mock_model在instanced对象中不可用?

时间:2010-11-03 01:49:19

标签: ruby-on-rails rspec

我在名为Project的模型中有这个代码。它在项目保存之前将所有者设置为项目。

before_save :set_owner

# Set the owner of the project right before it is saved.
def set_owner
  self.owner_id = mock_model(User).id # current_user.id is stubbed out for a mock_model.
  # Lifecycle is set by the form's collection_select
end

在我的Rspec测试中,current_user函数被删除以返回一个mock_model(这就是为什么上面的代码显示的是mock_model而不是current_user)。

现在,当我运行这个时,我的Rspec测试会中断并抱怨:

undefined method `mock_model' for #<Project:0x105c70af0>

我的猜测是,因为before_save是一个实例函数,它以某种方式认为mock_model是Project中定义的函数。

有人必须在此之前遇到过这种情况......有什么方法吗?

1 个答案:

答案 0 :(得分:2)

立即突出两件事:

  1. 您不应该在实际的Project模型中使用mock_model。所有测试代码都应保留在规范中。

  2. 您无法将current_user对象从控制器传递给模型(至少不应该以任何方式)。

  3. 我会在项目模型中使用attr_accessor来设置current_user id。

    class Project < AR::Base
      attr_accessor :current_user
    
      def set_owner
        self.owner_id = current_user.id unless current_user.nil?
      end
    end
    

    那么你的规范应该看起来更像是:

    it "should set the owner id" do
      user = mock_model(User)
      project = Project.new
      project.current_user = user
      project.save
      project.owner_id.should == user.id
    end