7

RSpec でテストする Rails アプリケーションがあります。Memcached に依存する操作を指定したいと考えています。そうするためのベストプラクティスは何ですか?

へのすべての呼び出しをスタブ化することでこれを行うことを考えましたRails.cache。これは良い考えですか?

@Pan Thomakos の提案に従って、テストしようとしているシナリオの 1 つについて詳細を追加します。

システムにはアカウントの概念があるため、リクエストごとに現在のユーザーと現在のアカウントを取得します。システムには多くのアカウントがないため、すべてをキャッシュに保持し、そこから取得します。

def self.find_by_slug(slug)  
  Rails.cache.fetch(Account.cache_key_for_slug(slug), :expires_in => 1.day) { super }  
end

このため、この場合のキャッシングは、あると便利なだけではなく、予想される動作であり、テストしたいものでもあります。したがって、キャッシュをオフにしてもうまくいきません。

4

2 に答える 2

2

IMHOをスタブせずにテストしてください!

シーケンスは次のようになります。

  1. Cache.flush # または同等のもの
  2. Cache.get(slug).shouldbe null # テスト キャッシュは空です
  3. Method.find_by_slug(slug).should == 'some value' # メソッドの単語をテストする
  4. Cache.get(slug).should == 'some value' # キャッシュに値があることをテストします。

個人的には、手元にリソースがある場合は、スタブを使用すべきではないと思います。リソースが手元にない場合 (つまり、サード パーティのサービス)、スタブを使用する必要があります。

スタブの問題は、スタブしているコードを変更した場合、それが壊れているかどうかわからないことです。

この場合の例は、標準の memcache gem から Dahli?、または false、null、またはその他の値を別の方法で返すことによってキャッシュ ミスを処理する他の memcache gem に切り替えた場合です。私は本当に意味します!Cache.set("my_key", false)! :)

切り替えの例としては、ASCII プロトコルを離れて、より高速なバイナリ プロトコルに移行することが挙げられます。

Memcache は安価なリソースであり、このテストを行うために 1 メガの RAM でセットアップできます。mysqlでも同じことができるとさえ言えます。mysql よりも大きなものは、それらのリソースを「セットアップ」するためのコストが重要になるため、スタブに傾倒し始めます。YMMV。

-ダニエル

于 2011-05-22T20:03:46.717 に答える