Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how can I test rails cache feature

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 ?

like image 809
Johnny Cash Avatar asked Apr 22 '13 21:04

Johnny Cash


People also ask

Where does Rails store cache?

ActiveSupport::Cache::MemCacheStore uses Danga's memcached server to provide a centralized cache for your application. Rails uses the bundled dalli gem by default. This is currently the most popular cache store for production websites.

What is cache in testing?

A cache is temporary storage for data (determined by the website creator) from the visited web page. First of all, many elements on the web pages are the same: images, HTML, CSS, JavaScript, and there is no point in reloading them every time.

Does Rails cache use Redis?

Rails 5.2 introduced built-in Redis cache store, which allows you to store cache entries in Redis.


1 Answers

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.

like image 124
Chris Heald Avatar answered Oct 19 '22 12:10

Chris Heald