with tests test run rails how example effective better ruby-on-rails ruby testing rspec

ruby-on-rails - tests - rspec rails 5



Cuál es la diferencia entre simulacro y mock_model en RSpec (2)

Recientemente me encontré con diferentes tutoriales, donde las personas usan funciones mock y mock_model .

En el tutorial RSpec para controladores usan la función mock_model , pero justo en la documentación de RSpec , solo hay una función mock , pero no mock_model

Traté de realizar algunas pruebas yo mismo, y no encontré ninguna diferencia real, ya que todo estaba bien cuando usaba cualquiera de esas dos funciones, entonces ¿hay alguna diferencia?


Como dijo jenger mock_model es una extensión construida para el registro activo:

Esta es la fuente 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

Así que es bastante dulce, pero

  • archiva la identificación con la siguiente en una secuencia
  • talones to_param
  • stubs new_record? con falso
  • stubs errors así que piensa que no hay errores

También amplía la instancia del modelo con muchas cosas.


De: Ayudantes útiles para los simulacros de RSpec

En primer lugar, mock_model define automáticamente identificadores únicos para los modelos que se crearon con él. En segundo lugar, define los métodos to_param (devuelve la representación de cadena de la identificación) y new_record? (devuelve falso).