En el momento (rspec-burla 2.10.1) no es un método equivalente a unstub
pero para should_receive
. Puede restablecer todos los resquicios y burlas con rspec_reset
, y también puede escribir hacks sucios para eliminar una expectativa particular (que no recomendaría).
El siguiente es un ejemplo de la eliminación de todos los talones y las expectativas sobre un objeto:
describe "resetting stubs and expectations with rspec_reset" do
before do
@person = mock('person')
@person.should_receive(:poke)
end
it "should not fail when we reset all stubs and expectations" do
@person.rspec_reset
end
end
Tenga en cuenta que este método se anota en el código fuente rspec como @private
, lo que significa que usted debe evitar el uso de más de lo absolutamente necesario y puede romperse en versiones futuras de rspec sin previo aviso. Sin embargo, es ampliamente utilizado en las especificaciones de rspec en sí, por lo que parece menos probable que esto se desaproveche pronto.
Después de cavar a través del código rspec-burla un poco más, por supuesto puede hacer algo realmente desagradable y arrancar la expectativa específica usted mismo:
# Works in rspec 2.10.1
describe "removing an expectation with an ugly hack" do
before do
@person = mock('person')
@person.should_receive(:poke)
end
it "should not fail after we hack rspec by violating every law of good programming, ever" do
@person.instance_variable_get(:@mock_proxy).instance_variable_get(:@method_double)[:poke].clear
end
end
Esto es muy malo ya que viola la encapsulación de el paquete de prueba rspec y no deberías hacerlo. En cambio, si realmente tiene una razón convincente para eliminar una expectativa particular, lo correcto sería agregar un método público en sentido ascendente en rspec-mocks que agregue un método paralelo al unstub
pero para eliminar expectativas específicas. Probablemente se encuentra aquí (nota de la definición de stub
y unstub
así en este archivo):
https://github.com/rspec/rspec-mocks/blob/master/lib/rspec/mocks/methods.rb
Antes de salir y el uso de cualquiera de las sugerencias anteriores para eliminar la expectativa es posible que desee considerar si sus especificaciones realmente necesitan hacer esto o si deberían ser refactorizadas. Usar should_receive
es una afirmación sobre su código, y generalmente debería intentar crear ejemplos (es decir, bloques it
) que solo afirman una cosa. Me gustaría saber por qué necesita algo como rspec_reset
a menos que intente hacer demasiado en la configuración global (por ejemplo, before :each
o antes: todos los bloques) o si sus ejemplos intentan hacer demasiado (es decir, con múltiples aserciones en un solo ejemplo).
La única excepción a esto puede estar, por supuesto, en el conjunto de pruebas de rspec-mocks, donde rspec_reset
se usa para restablecer el estado entre ejemplos que prueban la funcionalidad de la aplicación de stubs y mocks. A menos que esté haciendo eso, es probable que sus pruebas se puedan mejorar para no depender de reinicios globales de trozos y burlas en un objeto.
Espero que esto ayude y hágamelo saber si cree que hay un caso legítimo para agregar un método equivalente al unstub
pero para las expectativas del mensaje (es decir, después de usar should_receive
). Si estoy convencido de que esto está bien, consideraría agregar este método y proponerlo para ser agregado en sentido ascendente. ¿Tal vez se llamaría unset_expectation
? Siéntase libre de usar la guía en el código y las estructuras internas anteriores para armar una solicitud de extracción de rspec-mocks por su cuenta, y veremos si se acepta para crear una burla equivalente al unstub
.
¡Es ridículo que no puedas hacer una edición de menos de 6 caracteres! Su nombre de método dice 'mocking_resest' y debería decir' mocking_reset'. –
Agregue un mensaje de edición y su edición excederá los 6 caracteres :) – Galen