Pruebas Rspec de la columna counter_cache que regresan 0

Hace días que trato de llegar al fondo de lo que debería ser algo que debería ser muy fácil de hacer … Sin embargo, todavía soy muy nuevo en el mundo de los Rails y el Ruby y no puedo resolver este problema. .. :pag

De todos modos, el problema que tengo es que tengo varias columnas: counter_cache en las de mi modelo, que funcionan bastante bien al probarlas manualmente. Sin embargo, estoy deseando hacer lo de TDD y no puedo coserlos para probarlos en rspec por alguna razón desconocida.

De todos modos, aquí hay un ejemplo de mi modelo (usuario, comentarios y medios):

class User < ActiveRecord::Base has_many :comments has_many :media, dependent: :destroy end class Comment  true belongs_to :user, :counter_cache => true validates :user_id, :presence => true validates :content, :presence => true, :length => { :maximum => 255 } end class Medium  true has_many :comments, as: :commentable validates :user_id, presence: true validates :caption, length: { maximum: 140 }, allow_nil: true, allow_blank: true default_scope order: 'media.created_at DESC' end 

Aquí hay ejemplos de la configuración del esquema de la tabla:

 create_table "users", :force => true do |t| t.integer "comments_count", :default => 0, :null => false t.integer "media_count", :default => 0, :null => false end create_table "comments", :force => true do |t| t.text "content" t.integer "commentable_id" t.string "commentable_type" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "user_id" end create_table "media", :force => true do |t| t.integer "user_id" t.string "caption" t.datetime "created_at", :null => false t.datetime "updated_at", :null => false t.integer "comments_count", :default => 0, :null => false end 

Y ahora aquí hay una muestra de un ejemplo de rspec que he probado:

 require 'spec_helper' describe "Experimental" do describe "counter_cache" do let!(:user) { FactoryGirl.create(:user)} subject { user } before do @media = user.media.create(caption: "Test media") end its "media array should include the media object" do m = user.media m.each do |e| puts e.caption # Outputting "Test media" as expected end user.media.should include(@media) #This works end it "media_count should == 1 " do # This isnt working? puts user.media_count #Outputting 0 user.media_count.should == 1 end end end 

Y finalmente el mensaje de error que rspec me está dando:

 Failures: 1) Experimental counter_cache media_count should == 1 Failure/Error: user.media_count.should == 1 expected: 1 got: 0 (using ==) # ./spec/models/experimental_spec.rb:24:in `block (3 levels) in ' Finished in 0.20934 seconds 2 examples, 1 failure 

También tenga en cuenta que esto está sucediendo para todas las columnas de counter_cache en todos mis modelos. También he probado varias formas diferentes de probar esto, pero todas están devolviendo el mensaje de error anterior.

Realmente espero que alguien me pueda ayudar con esto. 🙂

¡Muchas gracias de antemano! Lucas

El counter_cache se está actualizando en la base de datos directamente. Esto no afectará la copia del modelo que ha cargado en la memoria, por lo que debe volver a cargarlo:

 it "media_count should == 1 " do user.reload user.media_count.should == 1 end 

Pero, no creo que sea así como probaría esto. Tal como lo tiene, su prueba está muy estrechamente relacionada con el código de configuración que parece que no necesita estar allí en absoluto. ¿Qué tal algo como esto para una especificación independiente?

 it "has a counter cache" do user = FactoryGirl.create(:user) expect { user.media.create(caption: "Test media") }.to change { User.last.media_count }.by(1) end 
    Intereting Posts