2009-08-12 13 views
34

I niedawno natknąłem różnych ćwiczeń, w których ludzie korzystają zarówno mock i mock_model funkcje.Jaka jest różnica między makiety i mock_model w RSpec

W RSpec tutorial for controllers one korzystać z funkcji mock_model, ale w samym documentation of RSpec, jest tylko mock funkcja, ale nie mock_model

Próbowałem uruchomić kilka testów siebie, a ja nie znaleźć jakąkolwiek istotną różnicę, ponieważ wszystko było w porządku, gdy użyłem jednej z tych dwóch funkcji, więc czy jest jakakolwiek różnica?

+6

Dla osób, które znalazły to pytanie w rankingu Google dla "rspec mock_model", najlepszą dokumentację można znaleźć na stronie https://www.relishapp.com/rspec/rspec-rails/docs/mocks/mock-model –

Odpowiedz

33

Jak jenger powiedział mock_model jest rozszerzeniem zbudowany dla aktywnego rekordu:

To źródło w 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 

Więc jej dość kęs, ale

  • koduje identyfikator następną sekwencją
  • stubs to_param
  • zalety new_record? z fałszywych
  • błędów stubs więc zdaniem nie ma błędów

rozciąga się również wystąpienie modelu z wieloma rzeczami.

9

Od: Useful helpers for RSpec mocks

Po pierwsze, mock_model automatycznie definiuje unikalne identyfikatory dla modeli, które zostały utworzone za pomocą go. Po drugie, to definiuje metody(ciąg znaków reprezentujący identyfikator) i new_record? (zwraca wartość false).

Powiązane problemy