2016-12-06 3 views
1

GetOrAddAsyncという名前の関数をモックしようとしています。だから、基本的にキーは、それが作成しますそれには何が戻っている場合はありませんが存在する場合LazyCacheを使ったMoqとAsync fun

DateTimeOffset cacheTimeout = new DateTimeOffset(DateTime.Now.AddHours(config.CacheHours)); 
Func<Task<IEnumerable<int>>> func = async() => await (from s in dbContext.Names select s.First).ToListAsync(); 

return await cache.GetOrAddAsync(key, func, cacheTimeout); 

:私はのように私はそれを使用する私の実際のコードでそれを使用する場合

Task<T> GetOrAddAsync<T>(string key, Func<Task<T>> addItemFactory, DateTimeOffset expires); 

:それは次のように定義されていますFunc <>のキーから返されたデータでキーを埋めてください。これまでの

私のモックの試みは次のとおりです。ただし、これはエラーを返して

cache.Setup(x => x.GetOrAddAsync(It.IsAny<string>(), It.IsAny<Func<Task<IEnumerable<int>>>>(), It.IsAny<DateTimeOffset>())) 
       .ReturnsAsync(async (string key, Func<Task<IEnumerable<int>>> func, DateTimeOffset policy) => 
        { 
         return await func.Invoke(); 
        }); 

:それはデリゲート型ではないので

は「IEnumerableを」と入力するラムダ式を変換できません。 。

私の心はこの構文:)

答えて

2

ReturnsAsyncあなたは非同期コールバック関数を持っているときに使用されるものではないと爆発する準備ができて、より多くの.ReturnsAsync(foo)を行うと考えるが.Returns(Task.FromResult(foo))のためだけの省略形です。だから、やろうとしている

cache.Setup(x => x.GetOrAddAsync(It.IsAny<string>(), It.IsAny<Func<Task<IEnumerable<int>>>>(), It.IsAny<DateTimeOffset>())) 
       .Returns(Task.FromResult(async (string key, Func<Task<IEnumerable<int>>> func, DateTimeOffset policy) => 
        { 
         return await func.Invoke(); 
        })); 

通常Returns(を使用してに変更し、あなたの関数と同じことは、正常に動作する必要があります。

cache.Setup(x => x.GetOrAddAsync(It.IsAny<string>(), It.IsAny<Func<Task<IEnumerable<int>>>>(), It.IsAny<DateTimeOffset>())) 
      .Returns(async (string key, Func<Task<IEnumerable<int>>> func, DateTimeOffset policy) => 
       { 
        return await func.Invoke(); 
       }); 
+0

私はとても近かった:)。ありがとうございました! – user441521

0

Moqを使ってLazyCache APIをモックするのではなく、フレームワークで提供されているモックバージョンを使用するのはなぜですか?キャッシュされる代理人が何であっても実行し、キャッシングは一切行いません。チェックアウトMockCachingService.cs

関連する問題