with spec run rails describe ruby-on-rails ruby plugins fixtures

ruby-on-rails - run - rspec with rails



¿Complemento de sustitución de dispositivo preferido en Rails? (9)

Hay una docena de complementos de Rails cuyo objetivo es reemplazar luminarias en las pruebas. Aquí hay algunos que puedo pensar:

  • reemplazo del accesorio
  • chica de fábrica
  • fábricas y trabajadores
  • escenarios de carriles
  • Fixture-scenarios
  • objeto papá

Probablemente haya otros. ¿Cuál de estos complementos prefieres y por qué?


+1 chica de fábrica


Factory Girl es genial. Lo usamos en cargas de trabajo.

Factory.define :usa, :class => Team do |f| f.country_name ''USA'' f.rank 15.6 end Factory.define :player do |f| f.first_name ''Stevie'' f.last_name ''Wonder'' f.team Factory.build(:usa) end

Luego, en sus especificaciones, puede usar Factory.build(:usa) o Factory.create(:usa) para crear o crear un equipo de EE. UU., Factory.create(:usa) .


He estado jugando con maquinistas últimamente y estoy cavando.


Recién comenzamos a usar Factory Girl para nuestros proyectos. Su forma de hacer las cosas no era muy diferente de nuestra solución local, por lo que funciona bien para nosotros.


Soy un gran admirador de la fábrica cuando solo necesitas uno o algunos objetos. Puedes escribir el tuyo o usar Thoughtbot''s Factory Girl .

Para situaciones en las que necesite un conjunto de objetos interrelacionados, los accesorios vencerán de fábrica, y debería echar un vistazo a los excelentes accesorios Lite que hacen que los accesorios sean considerablemente más DRY y manejables.


También le puedo dar a Factory Girl uno más. La forma en que puede asociarse entre fábricas múltiples es realmente útil cuando tienes un conjunto de modelos algo normal. Un proyecto tiene un gerente de proyecto, por ejemplo.

Factory.define :project_manager do |f| f.first_name "John" f.last_name "Doe" end Factory.define :project do |f| f.name "Sample Project" f.association :project_manager end

De esta forma, no tendrá que preocuparse por establecer realmente las relaciones en cada prueba. También puede hacer un trabajo como Faker, donde puedes construir datos de muestra en fábricas usando Factory.sequence. Para toda la información sobre Factory Girl, visita: http://dev.thoughtbot.com/factory_girl/ .



Yo personalmente uso a Faker con una clase personalizada de fábrica. Esto me permite crear mis fábricas y poblar las instancias generadas con datos no estáticos.

# spec/factory.rb module Factory def self.create_offer(options={}) Offer.create({ :code => Faker::Lorem.words(1), :expires_on => Time.now + (rand(30) + 1).day }.merge(options)) end end # spec_helper.rb require ''faker'' require ''spec/factory'' # In the specs @offer = Factory.create_offer(:code => ''TESTING'')


Defenderé el reemplazo de artefactos 2 . Sus atributos de modelo predeterminados (no se preocupan) se almacenan en un solo lugar, db / example_data.rb, y proporcionan objetos válidos rápidamente. Cualquier atributo que especifique en la creación anula los atributos predeterminados, lo que significa que los datos que le interesan están en la prueba , y nada más.

Sus datos de ejemplo también pueden referirse a otros modelos predeterminados, que están representados por procesos con evaluación diferida, por lo que puede anular asociaciones fácilmente cuando lo desee.

La versión 2 proporciona un formato de definición mucho más limpio, al tiempo que proporciona los new_*, create_*, and default_* mágicos new_*, create_*, and default_* para cada modelo.

Evitaría cualquier tipo de esquema de "escenarios" que fomente la construcción de más y más datos de prueba que es difícil de leer más tarde. Puede crear objetos con nombre (personalizados) con FR2, pero nunca lo he encontrado necesario.

PD. Asegúrese de tener en cuenta también su estrategia de prueba de la unidad : los dispositivos y todos sus análogos son objetos reales que llegan al DB, lo que los convierte en pruebas funcionales o de integración. Actualmente estoy usando la burla de RSpec junto con stub_model() y la última joya de unit_record para no permitir el acceso a la base de datos.