1

同じクラス内の別のメソッドを呼び出すメソッドをテストしています。

この内部メソッド呼び出しが結果を返すかどうかに応じて、私は異なることをします。この場合、それはCacheクラスであり、私は自分のGetOrStoreメソッドをテストしています。GetnullをGet返すときと何かを返すときの2つのパスをテストしたいと思います。

Getから呼び出されたときの出力を制御するための正しいアプローチは何GetOrStoreですか?モックインスタンスで実行する必要があるように感じGetますが、同じクラスの2つのメソッドを指定して実行する方法がわかりません。

アップデート

現時点で私が考えることができる唯一のことは、テストを実行する前にキャッシュキーが削除されていることを確認することです。

  HttpRuntime.Cache.Remove("foo"); // Make sure foo isn't in the cache.

  var output = _cache.GetOrStore("foo", () => "Foo", 100);
  Assert.AreEqual(output, "Foo");

しかし、これはただ間違っていると感じます。テスト中にHttpRuntimeキャッシュに実際に触れたくありません。

4

2 に答える 2

1

これに対する答えは、モックCallBaseされたインスタンスのMoqsプロパティにあります。

モックオブジェクトの実インスタンスで明示的に設定CallBasetrueれていないメソッドが呼び出されるように設定します。

Getこれは、メソッドをセットアップしてもGetOrStore正しく実行できることを意味します。

  var _mockCache = new Mock<Cache>();
  _mockCache.Setup(m => m.Get(It.IsAny<string>())).Returns(null);
  _mockCache.CallBase = true;

  var output = _mockCache.Object.GetOrStore("foo", () => "Foo", 100);
  Assert.AreEqual("Foo", output);
于 2012-05-23T11:07:58.737 に答える
0

投稿したコードは、テストしているキャッシュクラスで、GetメソッドがHttpRuntime.Cacheの静的メソッドを呼び出すことを意味します。これは本当ですか?

このような可変の静的状態は、一般的に回避するのが最善です。HttpRuntime.Cacheをラップするプロキシクラスを作成し、そのインスタンスにキャッシュを依存させることができます。次に、テストで、プロキシを簡単に制御できるモックバージョンに置き換えることができます。

于 2012-05-23T11:00:21.953 に答える