2013-04-22 19 views
5

これは私のタグモデルで、Rails.cache機能をどのようにテストできますかわかりません。レールキャッシュ機能をテストするにはどうすればいいですか

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 

どうすればテストできますか?

答えて

7

まずは、フレームワークを実際にテストするべきではありません。 Railsのキャッシングテストではそれが表面的にカバーされています。あなたが少しでも助けてくれる人は、this answerを参照してください。あなたのテストは、次のようになります - #fetchブロックが呼び出されていないだけという

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 

これは実際にキャッシュメカニズムをチェックしません。それは脆弱でフェッチブロックの実装に結びついているので、メンテナンス債務になるので注意してください。

+1

テスト環境ではどのキャッシュストアを使用していますか?あなたはtest.envでこれを持っていますか? '' 'config.cache_store =:memory_store''' – knagode

+1

フレームワークをテストすることは、私が理解している方法で動作することを完全に確認していると思います。ドキュメントは私には分かりませんが、私は自分の理解が完全にわからないかもしれません。 TDDの場合と同様に、テストケースを書くだけで、私が達成しようとしていることを明確にするのに役立ちます。 –

関連する問題