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 ?
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.
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.
Rails 5.2 introduced built-in Redis cache store, which allows you to store cache entries in Redis.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With