2011-04-26 8 views
8

¿cómo puedo usar TDD con MongoDB como mi segunda base de datos?TDD: Rspec Ruby MongoDB/Ruby Mongo Driver

Gracias

Editar:

Uso Rspec o cualquier otra cosa que me permite probarlo.

+0

¿Está usando el controlador MongoDB desnudo, o tiene un ORM como MongoMapper, Mongoid, etc.? Además, ¿está utilizando MongoDB como la capa de persistencia para sus modelos, para el almacenamiento en caché, archivos a través de GridFS, etc.? Alguna información extra sería útil. – michaeltomer

+0

Solo el mapeador ruby ​​mongo y no como la base de datos principal. Sin almacenamiento en caché, nada. Sin embargo, representa una gran parte de las aplicaciones que ahorra toneladas de datos persistentes. – donald

+0

Estás hablando de una arquitectura ployglot ¿verdad? algunos modelos con activerecord, otros como documentos mongo? Puedo mostrar cómo lo hago con mongomapper, interesado? – oma

Respuesta

4

[Actualización] Con MongoMapper estableció que pueda usar la conexión mongodb directamente

mongodb = MongoMapper.database 
collection = mongodb.collection("my_collection") 
collection.find.first 
=> {"_id"=>BSON::ObjectId('4e43dfc75d1e1e0001000001'), "key1"=>"val1" } 

este otro SO Q/A es aún más directa, utilizando las funciones de Javascript como MongoMapper.database.eval(Mongo::Code.new('function(){ return 11 + 6; })

[/ update]

Tengo una arquitectura tan políglota, algunos modelos con postgresql, otros como mongo docu mentos. No estoy muy seguro de lo que me estás preguntando, así que iré directo y publicaré la mayoría de mi configuración aquí. Incluye mis hacks, probablemente encuentres una configuración más hermosa en otro lugar.

puse la configuración de una esencia https://gist.github.com/957341

OK, así que aquí tiene un documento con el documento incrustado, a continuación, la especificación. Escribí las especificaciones una por una, así que están un poco impulsadas por las pruebas.

class MyDocument 
    include MongoMapper::Document 
    key :title, String 
    key :published_at, Time, :index => true 
    key :collaborators, Array 

    many :my_embedded_documents 
end 
class MyEmbeddedDocument 
    include MongoMapper::EmbeddedDocument 
    key :title, String 
    key :author, String 
    embedded_in :my_document 
end 

la especificación

require "spec_helper" 

describe MyDocument do 

    before do 
    @md = MyDocument.create(:title => "Example", :collaborators => ["mongomapper", "rspec", "oma"]) 
    end 
    it "should have title" do 

    found = MyDocument.find(@md.id) 
    found.title.should == "Example" 
    end 

    it "should have two my_documents" do 
    MyDocument.create 
    MyDocument.count.should == 2 
    end 

    it "should be able to fetch embedded documents" do 
    @md.my_embedded_documents << MyEmbeddedDocument.new(:title => "The King", :name => "Elvis Presley") 
    @md.my_embedded_documents.build(:title => "Embedded example", :name => "Embeddo") 
    @md.save! 
    MyDocument.where(:title => "Example").first.should == @md #findMyEmbeddedDocument.count.should == 2 
    end 

end 

spec_helper.rb

RSpec.configure do |config| 
    #... 
    config.after(:each) do 
    MongoMapper.database.collections.each(&:remove) 
    end 
end 

No sé lo que quería respuestas, pero espero que esto será de gran ayuda a alguien.

0

Por lo que puedo deducir, no parece que su aplicación se adhiera al paradigma MVC de rails con el uso de esta base de datos secundaria que aparentemente no almacena datos de modelo.

Recomendaría tomar las partes auxiliares de la aplicación que dependen de mongo y pegarlas en una biblioteca. Puedes hacer de esto una joya si tiene sentido usarla en otro lado. Luego, cree una suite de pruebas para la lógica de la biblioteca usando herramientas de prueba estándar, e integre en su aplicación ya sea con un requerimiento simple o con algunas directivas (dependiendo de lo que muera y cómo piensa usarlo).