2009-08-12 34 views
34

我最近在不同的教程,那裏的人同時使用mockmock_model功能來模擬和mock_model之間的差異。是什麼在RSpec的

RSpec tutorial for controllers他們使用mock_model功能,但就在documentation of RSpec,只有mock功能,但沒有mock_model

我試圖運行一些測試自己,而我卻沒有發現任何真正的區別,因爲一切正常,當我用任何的這兩個函數,那麼有沒有在所有的有什麼區別?

+6

對於人發現這個問題,在谷歌排名「rspec的mock_model」,最好的文檔,可以在https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model找到 – 2011-11-14 04:58:45

回答

33

正如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 

因此其相當拗口,但它

  • 將該編號與下一個編號相關聯
  • 存根編號to_param
  • 存根new_record?假
  • 存根錯誤,所以它認爲沒有錯誤

它還擴展模型實例有一堆東西。

9

來源:Useful helpers for RSpec mocks

首先,mock_model自動 定義模型唯一的ID,這 使用它創建。其次,它 定義了方法to_param(返回的ID的 字符串表示)和 new_record?(返回false)。