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.
Author by
Johnny Cash
Updated on June 23, 2022Comments
-
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 over 7 yearsAnd which cache store are you using in test environment? Do you have this in test.env?
config.cache_store = :memory_store
-
Les Nightingill almost 7 yearsI 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.