6

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 ?

4

2 に答える 2

8

まず、フレームワークを実際にテストするべきではありません。Rails のキャッシング テストは、表向きはそれをカバーしています。とはいえ、使用できる小さなヘルパーについては、この回答を参照してください。テストは次のようになります。

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

これは実際にはキャッシュメカニズムをチェックしません-#fetchブロックが呼び出されないだけです。これは脆弱で、fetch ブロックの実装に結び付けられているため、メンテナンスの負債になるので注意してください。

于 2013-04-22T21:44:06.437 に答える