19

Redis にデータをキャッシュするモデル クラスがあります。モデルのメソッドを初めて呼び出すと、JSON/ハッシュ値が計算され、Redis に保存されます。特定の状況下では、そのデータを「フラッシュ」し、次の呼び出しで再計算します。

Redis にデータを保存するために使用するものと同様のコード スニペットを次に示します。

def cache_data
  self.data_values = data_to_cache
  REDIS.set(redis_key,ActiveSupport::JSON.encode(self.data_values))
  REDIS.get(redis_key) 
end

def data_to_cache
  # generate a hash of values to return
end

このコードを単体テストするにはどうすればよいですか? RSpecとカピバラを使っています。また、それが役立つ場合は、統合テストに Cucumber と Capabara を使用します。

4

2 に答える 2

22

テストの実行中に redis を実行するのが好きです。Redis は、postgres などとは異なり、非常に高速であり、テストの実行時間が著しく遅くなることはありません。

ブロックまたは対応する cucumber フックを呼び出していることを確認してくださいREDIS.flushbefore(:each)

redis とは独立してテストできdata_to_cacheますが、使用している redis ドライバーとそれが提供するコントラクトを完全に信頼できない場合は、実際にcache_data(および対応するキャッシュ フェッチ メソッドを) ライブでテストする方が安全です。これにより、テストを大幅に書き直すことなく、別の redis ドライバー (または別の高速 KV ストア) に切り替えることもできます。

于 2012-05-15T08:29:48.753 に答える
21

まず、spec_helper.rbに以下のコードを追加して、redisサーバーがインストールされていない場合でも、どのマシンでもテストが実行されるようにします(テストスコープでgemfilemock_redisに追加してください:

redis_instance = MockRedis.new
Redis.stub(:new).returns(redis_instance)
Redis::Store.stub(:new).returns(redis_instance)

その後、私はテストします:

  1. REDISに書き込まれるデータは予想されるデータです
  2. cache_data、flush_data、cache_dataのシーケンスは、data_to_cacheを2回呼び出します
于 2012-05-08T19:31:57.693 に答える