how can I test rails cache feature

15,943

Well, first, you shouldn't really be testing the framework. Rails' caching tests ostensibly cover that for you. That said, see this answer for a little helper you can use. Your tests would then look something like:

describe Tag do
  describe "::all_cached" do
    around {|ex| with_caching { ex.run } }
    before { Rails.cache.clear }

    context "given that the cache is unpopulated" do
      it "does a database lookup" do
        Tag.should_receive(:order).once.and_return(["tag"])
        Tag.all_cached.should == ["tag"]
      end
    end

    context "given that the cache is populated" do
      let!(:first_hit) { Tag.all_cached }

      it "does a cache lookup" do
        before do
          Tag.should_not_receive(:order)
          Tag.all_cached.should == first_hit
        end
      end
    end
  end
end

This doesn't actually check the caching mechanism - just that the #fetch block isn't invoked. It's brittle and tied to the implementation of the fetch block, so beware that as it will become maintenance debt.

Share:
15,943
Johnny Cash
Author by

Johnny Cash

Updated on June 23, 2022

Comments

  • Johnny Cash
    Johnny Cash about 2 years

    This is my Tag model and I don't know how can I test Rails.cache feature.

    class Tag < ActiveRecord::Base
      class << self
        def all_cached
          Rails.cache.fetch("tags.all", :expires_in => 3.hours) do
            Tag.order('name asc').to_a
          end
        end
        def find_cached(id)
          Rails.cache.fetch("tags/#{id}", :expires_in => 3.hours) do
            Tag.find(id)
          end
        end
      end
    
      attr_accessible :name
      has_friendly_id :name, :use_slug => true, :approximate_ascii => true
      has_many :taggings #, :dependent => :destroy
      has_many :projects, :through => :taggings
    end
    

    Do you know how can it will be tested ?

  • knagode
    knagode over 7 years
    And which cache store are you using in test environment? Do you have this in test.env? config.cache_store = :memory_store
  • Les Nightingill
    Les Nightingill almost 7 years
    I think that testing the framework is perfectly ok to confirm that it works the way I understand it to. The docs may not be clear to me, or I just may not completely sure of my understanding. As with TDD, just the act of writing a test case can help me clarify exactly what I'm trying to achieve.