Supongamos que tiene un ActiveRecord :: Observer en una de sus aplicaciones de Ruby on Rails: ¿cómo prueba este observador con rSpec?¿Cómo evaluarías a los observadores con rSpec en una aplicación de Ruby on Rails?
Respuesta
Usted está en la derecha rastrear, pero me he encontrado con una cantidad de frustrantes mensajes de error inesperados al usar rSpec, observadores y objetos simulados. Cuando estoy probando la especificación de mi modelo, no quiero tener que manejar el comportamiento del observador en las expectativas de mi mensaje.
En su ejemplo, no hay una manera realmente buena de especificar "set_status" en el modelo sin conocimiento de lo que el observador le va a hacer.
Por lo tanto, me gustaría usar el "No Peeping Toms" plugin. Teniendo en cuenta el código de arriba y usando el plugin Sin mirones, me spec del modelo así:
describe Person do
it "should set status correctly" do
@p = Person.new(:status => "foo")
@p.set_status("bar")
@p.save
@p.status.should eql("bar")
end
end
Puede spec su código de modelo sin tener que preocuparse de que hay un observador que vendrá y destruirá tu valor. Se podría especificación que por separado en los person_observer_spec como este:
describe PersonObserver do
it "should clobber the status field" do
@p = mock_model(Person, :status => "foo")
@obs = PersonObserver.instance
@p.should_receive(:set_status).with("aha!")
@obs.after_save
end
end
si realmente desea probar el modelo acoplado y la clase de observador, puede hacerlo de esta manera:
describe Person do
it "should register a status change with the person observer turned on" do
Person.with_observers(:person_observer) do
lambda { @p = Person.new; @p.save }.should change(@p, :status).to("aha!)
end
end
end
99% de el tiempo, preferiría probar con los observadores apagados. Es más fácil de esa manera.
responsabilidad: en realidad nunca he hecho esto en un lugar de producción, pero parece una forma razonable sería utilizar objetos simulados, should_receive
y amigos, e invocar métodos en el observador directamente
Dada la siguiente modelo y observador:
class Person < ActiveRecord::Base
def set_status(new_status)
# do whatever
end
end
class PersonObserver < ActiveRecord::Observer
def after_save(person)
person.set_status("aha!")
end
end
me gustaría escribir una especificación así (me encontré con él, y que pasa)
describe PersonObserver do
before :each do
@person = stub_model(Person)
@observer = PersonObserver.instance
end
it "should invoke after_save on the observed object" do
@person.should_receive(:set_status).with("aha!")
@observer.after_save(@person)
end
end
Hemos estado siguiendo este enfoque y funciona maravillosamente –
no_peeping_toms es ahora una joya y se pueden encontrar aquí: https://github.com/patmaddox/no-peeping-toms
A partir de Rails 3.1 hay un método de desactivación para observadores. –
+1 no_peeping_toms –
Si desea probar que el observador observa el modelo correcto y recibe la notificación como era de esperar, aquí hay un ejemplo usando RR.
your_model.rb:
class YourModel < ActiveRecord::Base
...
end
your_model_observer.rb:
class YourModelObserver < ActiveRecord::Observer
def after_create
...
end
def custom_notification
...
end
end
your_model_observer_spec.rb:
before do
@observer = YourModelObserver.instance
@model = YourModel.new
end
it "acts on the after_create notification"
mock(@observer).after_create(@model)
@model.save!
end
it "acts on the custom notification"
mock(@observer).custom_notification(@model)
@model.send(:notify, :custom_notification)
end
- 1. Perfilando una aplicación ruby / ruby on rails
- 2. ¿Cómo desinstalo una aplicación Ruby on Rails?
- 3. ¿Cómo uso CSS con una aplicación de ruby on rails?
- 4. caracteres internacionales utilizando RSpec con Ruby on Rails
- 5. Convirtiendo una aplicación Ruby on Rails de sqlite a postgresql
- 6. upsert a granel con Ruby on Rails
- 7. link_to con Ruby on Rails
- 8. SSL con Ruby on Rails
- 9. HTTP-POST una imagen a la aplicación Ruby on Rails
- 10. Favicon en Ruby on Rails aplicación
- 11. Antipatterns con Ruby on Rails
- 12. ¿Implementando la búsqueda en una aplicación Ruby on Rails 3?
- 13. Cómo dominar Ruby on Rails
- 14. ¿Cómo iniciarse en TDD con Ruby on Rails?
- 15. Seguridad en angular.js con Ruby on Rails
- 16. Creación de una aplicación Calendario/Planificador - Ruby on Rails
- 17. Escribiendo una especificación para ayudante con Ruby on Rails y RSpec
- 18. ¿Cómo probar la aplicación de chat en Ruby on Rails?
- 19. cómo manipular DOM con Ruby on Rails
- 20. Invitación a la aplicación de Facebook de Ruby on Rails
- 21. Almacenamiento de documentos con Ruby On Rails
- 22. Ejecutando phantomjs desde una aplicación de Ruby on Rails
- 23. Ruby vs. Ruby on Rails
- 24. Ruby on Rails: ssl_required: ¿cómo habilito en toda la aplicación?
- 25. ¿Cómo funciona Ruby on Rails?
- 26. Renombrar la aplicación Ruby on Rails
- 27. Ruby on Rails will_paginate
- 28. ¿Cómo eliminar la gema de la aplicación Ruby on Rails?
- 29. Docsplit Ruby on Rails
- 30. Ruby on Rails en IIS?
Si quiero probar los observadores, entonces un patrón que uso es 'describe PersonOb servidor { around (: each) {| spec | Person.with_observers (: person_observer) {spec.run}}} 'Esto habilita al observador para todas las pruebas dentro del bloque de descripción de PersonObserver. – roo
Esta respuesta se expresa como una respuesta, pero no está claro para qué. Ciertamente no está respondiendo directamente a la pregunta ... –