2016-12-08 10 views
0

次のGetOrSetメソッドをInMemoryCacheクラスでモックしようとしています。私のテストでMoq:ファンクションコールバックをパラメータとして使用してメソッドをモックする方法

public class InMemoryCache : ICacheService 
{ 
    public T GetOrSet<T>(string cacheKey, Func<T> getItemCallback) where T : class 
    { 
     T item = MemoryCache.Default.Get(cacheKey) as T; 
     if (item == null) 
     { 
      item = getItemCallback(); 

      DateTime expireDateTime = new DateTime(DateTime.Today.Year, DateTime.Today.Month, DateTime.Today.Day, 4, 0, 0).AddDays(1); 
      MemoryCache.Default.Add(cacheKey, item, expireDateTime); 
     } 
     return item; 
    } 
} 

、私は

var mockCacheService = new Mock<ICacheService>(); 
mockCacheService.Setup(x => x.GetOrSet.. 

を持っている誰かが私にはドットを埋める手助けすることはできますか?私はこのような呼び出しを行う際に

は、私はそれはそれはあなたがテストしたいのかによって異なり

var countries = _cacheService.GetOrSet("CountriesDictionary",() => webApiService.GetCountries()) 
+0

希望する動作は何ですか? 'It.IsAny >()'を使ってください。また、メソッドに渡された値がnullの場合にはnullチェックを行うべきです。 – Nkosi

+0

@Nkosi上記の更新されたポストを参照してください。 – billboard

答えて

3

nullを返し、この

mockCacheService.Setup(x => x.GetOrSet(It.IsAny<string>(), It.IsAny<Func<object>>())) 
       .Returns(new Dictionary<string, string> { { "US", "USA"} }); 

のように設定するが、しています。ここではいくつかの例は以下のとおりです。

var mockCacheService = new Mock<ICacheService>(); 

// Setup the GetOrSet method to take any string as its first parameter and 
// any func which returns string as the 2nd parameter 
// When the GetOrSet method is called with the above restrictions, return "someObject" 
mockCacheService.Setup(x => x.GetOrSet(It.IsAny<string>(), It.IsAny<Func<string>>())) 
    .Returns("someObject"); 

// Setup the GetOrSet method and only when the first parameter argument is "Key1" and 
// the second argument is a func which returns "item returned by func" 
// then this method should return "someOtherObject" 
mockCacheService.Setup(x => x.GetOrSet("Key1",() => "item returned by func")) 
    .Returns("someOtherObject"); 

ItはなどIsInIsInRangeIsRegex 1がニーズに合うかを調べるなど、多くの異なる方法があります。

あなたはあなたのモックで何かを確認する必要があります。たとえば、以下では、メソッドがこれらの正確な引数で呼び出され、一度だけ呼び出されたことを検証しています。最初の引数として "Key1"、 "funcによって返された項目"を返すfuncで呼び出された場合、これは成功します。

mockCacheService.Verify(x => x.GetOrSet("Key1",() => "item returned by func"), Times.Once()); 

EDIT 1

これは重要です:

は、おそらくこれを知っているが、私はあなたがInMemoryCache.GetOrSetメソッドをテストするためにこれを使用していない願っています。ここでのアイデアは、あなたが他のクラスをテストしていることです。そのクラスは、特定の条件下では、上記のsetupメソッドの特定の設定でこのモックをよく呼び出すことができます。テスト対象のクラスが "Key1"でモックを呼び出しておらず、 "funcでアイテムを再帰させる"関数を返さない場合、テストは失敗します。つまり、テスト対象のクラスのロジックが間違っていることを意味します。あなたはすべてを嘲笑しているので、このクラスではありません。

+0

これは私のために働いていましたvar mockCacheService = new Mock (); mockCacheService.Setup(x => x.GetOrSet( "CountriesDictionary"、It.IsAny >>())) .Returns(新しい辞書 billboard

+0

すべてがうまくいきました。それは本当に重要な私の編集を参照してください。 – CodingYoshi

関連する問題