34 votes

Quelle est la différence entre mock et mock_model dans RSpec ?

Je suis récemment tombé sur différents tutoriels, où les gens utilisent à la fois mock y mock_model fonctions.

En Tutoriel RSpec pour les contrôleurs ils utilisent le mock_model mais directement dans la fonction documentation de RSpec il n'y a que mock mais pas de mock_model

J'ai essayé de faire quelques tests moi-même, et je n'ai pas trouvé de réelle différence, puisque tout était correct lorsque j'utilisais l'une ou l'autre de ces deux fonctions, alors y a-t-il une différence ?

33voto

Sam Saffron Points 56236

Comme jenger l'a dit, mock_model est une extension construite pour active record :

C'est la source en 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

C'est un peu long, mais c'est

  • remplace l'id par le suivant dans une séquence
  • stubs to_param
  • remplace new_record ? par false
  • stubs des erreurs pour qu'il pense qu'il n'y a pas d'erreurs

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

9voto

jengar Points 286

De : Aides utiles pour les mocks RSpec

Tout d'abord, mock_model automatiquement définit des identifiants uniques pour les modèles ont été créés à l'aide de ce système. Deuxièmement, il définit des méthodes to_param (renvoie chaîne de caractères de l'identifiant) et new_record? (renvoie faux).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X