RSpec中的mock和mock_model有什么区别?
我最近遇到了不同的教程,人们使用mock
和mock_model
函数。
在RSpec控制器教程中,他们使用mock_model
函数,但在RSpec的文档中 ,只有mock
函数,但没有mock_model
我试着自己去做一些testing,但是我没有发现任何真正的区别,因为当我使用这两个函数中的任何一个时,一切正常,那么是否还有什么区别呢?
正如jenger所说mock_model是为活动loggingbuild立的扩展:
这是1.2.6的源代码:
def mock_model(model_class, options_and_stubs = {}) id = options_and_stubs[:id] || next_id options_and_stubs = options_and_stubs.reverse_merge({ :id => id, :to_param => id.to_s, :new_record? => false, :errors => stub("errors", :count => 0) }) m = mock("#{model_class.name}_#{id}", options_and_stubs) m.__send__(:__mock_proxy).instance_eval <<-CODE def @target.as_new_record self.stub!(:id).and_return nil self.stub!(:to_param).and_return nil self.stub!(:new_record?).and_return true self end def @target.is_a?(other) #{model_class}.ancestors.include?(other) end def @target.kind_of?(other) #{model_class}.ancestors.include?(other) end def @target.instance_of?(other) other == #{model_class} end def @target.class #{model_class} end CODE yield m if block_given? m end
所以它相当一口,但它
- 在下一个序列中存储该id
- 存根to_param
- 存根new_record? 与假
- 存根错误,所以它认为没有错误
它还用一堆东西来扩展模型实例。
来自: 有用的RSpec嘲笑的帮手
首先,
mock_model
自动为使用它创build的模型定义唯一的id。 其次,它定义了方法to_param
(返回id的string表示)和new_record?
(返回false)。