2009-08-12 4 views
34

Je suis récemment tombé sur différents tutoriels, où les gens utilisent à la fois mock et mock_model fonctions.Quelle est la différence entre la maquette et mock_model dans RSpec

En RSpec tutorial for controllers ils utilisent la fonction mock_model, mais en plein documentation of RSpec, il n'y a mock fonction, mais pas mock_model

j'ai essayé de faire quelques tests moi-même, et je ne l'ont pas trouver une réelle différence, puisque tout allait bien quand j'utilisais l'une ou l'autre de ces deux fonctions, donc y a-t-il une différence?

+6

Pour les personnes ayant trouvé cette question classement dans Google pour "rspec mock_model", la meilleure documentation peut être trouvé à https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model –

Répondre

33

Comme Jenger dit mock_model est une extension construite pour l'enregistrement actif:

Ceci est la source 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 

donc son assez bouchée, mais il

  • stubs l'ID avec le suivant dans une séquence
  • stubs to_param
  • souches new_record? avec de faux
  • erreurs de talons il pense qu'il n'y a aucune erreur

Il étend également l'instance de modèle avec un tas de choses.

9

De: Useful helpers for RSpec mocks

Tout d'abord, mock_model automatiquement définit pour les modèles uniques ids qui ont été créés à l'utiliser. Deuxièmement, il définit les méthodes to_param (renvoie représentation sous forme de chaîne de l'ID) et new_record? (renvoie false).

Questions connexes