Estoy tratando de probar un alcance que tengo que se basa en una cadena de otros ámbitos. ("public_stream" a continuación).Stubbing Chained Queries in Rails 3 y Rspec
scope :public, where("entries.privacy = 'public'")
scope :completed, where("entries.observation <> '' AND entries.application <> ''")
scope :without_user, lambda { |user| where("entries.user_id <> ?", user.id) }
scope :public_stream, lambda { |user| public.completed.without_user(user).limit(15) }
Usando una prueba como esta:
it "should use the public, without_user, completed, and limit scopes" do
@chain = mock(ActiveRecord::Relation)
Entry.should_receive(:public).and_return(@chain)
@chain.should_receive(:without_user).with(@user).and_return(@chain)
@chain.should_receive(:completed).and_return(@chain)
@chain.should_receive(:limit).with(15).and_return(Factory(:entry))
Entry.public_stream(@user)
end
Sin embargo, sigue recibiendo este error:
Failure/Error: Entry.public_stream(@user)
undefined method `includes_values' for #<Entry:0xd7b7c0>
Parece includes_values es una variable de instancia del objeto ActiveRecord :: Relation , pero cuando intento resguardarlo, sigo recibiendo el mismo error. Me preguntaba si alguien tenía experiencia con el corte de las nuevas consultas encadenadas de Rails 3. Puedo encontrar un montón de discusión sobre hash find de 2.x, pero nada sobre cómo probar lo que está actualizado.
Por curiosidad, ¿funciona si no se utiliza 'public'?Hay un conflicto entre el nombre del alcance y la palabra clave Ruby 'public'. No estoy seguro de que ese sea el problema, pero estaría interesado en qué parte de la cadena falla esta prueba. –
Los ámbitos están directamente relacionados con la base de datos, por lo que no tiene sentido probarlos de forma aislada. Simplemente crea algunos registros reales y prueba qué devuelve la consulta. – RocketR