您可以在方法调用内为方法编写存根/模拟/双打吗?

问题描述

| 我的方法如下:
def some_method(....)

  user = User.where(\"....\").first

  if !user.nil?

     if ..
         user.delete
     elsif
         user.update_attributes(...)

  else
     new_user = User.new(...)
     new_user.save!
  end

end
如您所见,user和new_user都在此方法中实例化。 我在测试方法时是否可以对这些对象进行存根和模拟(期望)? 我正在尝试:
it \"should ....\" do

  d = double(\"user double\")
  d.should_receive(:save!).once

  res = User.some_method(....)

end
但是我得到一个错误,说预期是1次,收到了0次。 我这样做对吗? (显然不能,因为我无法将这些存根/模拟传递给被测试的方法,所以可以进行测试)     

解决方法

        您可以执行以下操作:
user_double = double(\"user\")
User.should_receive(:where).and_return(user_double)
user_double.should_receive(:delete)