2009-08-12 2 views
34

Ho recentemente sono imbattuto in diversi tutorial, in cui le persone utilizzano entrambe mock e mock_model funzioni.Qual è la differenza tra finto e mock_model in RSpec

In RSpec tutorial for controllers usano la funzione mock_model, ma comunque nel documentation of RSpec, c'è solo mock funzione, ma non mock_model

ho cercato di eseguire alcuni test di me, e io no trovare una vera differenza, dato che tutto andava bene quando ho usato una di queste due funzioni, quindi c'è qualche differenza?

+6

Per le persone che trovano questa domanda classifica in Google per "rspec mock_model", la migliore documentazione può essere trovata su https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model –

risposta

33

Come Jenger detto mock_model è un'estensione costruito per record attivo:

Questa è la fonte in 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 

Quindi è un bel boccone, ma

  • stub l'id con il successivo in sequenza
  • stub to_param
  • stub new_record? con false
  • errori stub quindi pensa che ci siano errori

Si estende anche l'istanza di modello con un sacco di roba.

9

Da: Useful helpers for RSpec mocks

Innanzitutto, mock_model automaticamente definisce ids unici per modelli, che stati creati utilizzando esso. In secondo luogo, lo standard definisce i metodi to_param (restituisce rappresentazione stringa dell'ID) e new_record? (restituisce false).