我最近在不同的教程,那裏的人同時使用mock
和mock_model
功能來模擬和mock_model之間的差異。是什麼在RSpec的
在RSpec tutorial for controllers他們使用mock_model
功能,但就在documentation of RSpec,只有mock
功能,但沒有mock_model
我試圖運行一些測試自己,而我卻沒有發現任何真正的區別,因爲一切正常,當我用任何的這兩個函數,那麼有沒有在所有的有什麼區別?
我最近在不同的教程,那裏的人同時使用mock
和mock_model
功能來模擬和mock_model之間的差異。是什麼在RSpec的
在RSpec tutorial for controllers他們使用mock_model
功能,但就在documentation of RSpec,只有mock
功能,但沒有mock_model
我試圖運行一些測試自己,而我卻沒有發現任何真正的區別,因爲一切正常,當我用任何的這兩個函數,那麼有沒有在所有的有什麼區別?
正如jenger說mock_model是活動記錄擴建了:
這是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
因此其相當拗口,但它
它還擴展模型實例有一堆東西。
來源:Useful helpers for RSpec mocks
首先,
mock_model
自動 定義模型唯一的ID,這 使用它創建。其次,它 定義了方法to_param
(返回的ID的 字符串表示)和new_record?
(返回false)。
對於人發現這個問題,在谷歌排名「rspec的mock_model」,最好的文檔,可以在https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model找到 – 2011-11-14 04:58:45