ユニットテストでIMemoryCacheをモックする 質問する

ユニットテストでIMemoryCacheをモックする 質問する

私はasp net core 1.0とxunitを使用しています。

を使用するコードの単体テストを記述しようとしていますIMemoryCache。ただし、 に値を設定しようとすると、IMemoryCacheNull 参照エラーが発生します。

私の単体テスト コードは次のようになります:
は、IMemoryCacheテストするクラスに挿入されます。ただし、テストでキャッシュに値を設定しようとすると、null 参照が取得されます。

public Test GetSystemUnderTest()
{
    var mockCache = new Mock<IMemoryCache>();

    return new Test(mockCache.Object);
}

[Fact]
public void TestCache()
{
    var sut = GetSystemUnderTest();

    sut.SetCache("key", "value"); //NULL Reference thrown here
}

そして、これはクラス Test です...

public class Test
{
    private readonly IMemoryCache _memoryCache;
    public Test(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;
    }

    public void SetCache(string key, string value)
    {
        _memoryCache.Set(key, value, new MemoryCacheEntryOptions {SlidingExpiration = TimeSpan.FromHours(1)});
    }
}

私の質問は...何らかの設定が必要ですかIMemoryCache? DefaultValue の値を設定しますか? IMemoryCacheMocked の場合、デフォルト値は何ですか?

ベストアンサー1

IMemoryCache.Set拡張メソッドなので、モック化することはできません。最小注文数フレームワーク。

拡張機能のコードは入手可能ですここ

public static TItem Set<TItem>(this IMemoryCache cache, object key, TItem value, MemoryCacheEntryOptions options)
{
    using (var entry = cache.CreateEntry(key))
    {
        if (options != null)
        {
            entry.SetOptions(options);
        }

        entry.Value = value;
    }

    return value;
}

テストでは、拡張メソッドを通じて安全なパスをモックして、完了までフローできるようにする必要があります。Setその中では、キャッシュエントリの拡張メソッドも呼び出されるため、これも考慮する必要があります。これはすぐに複雑になる可能性があるため、具体的な実装を使用することをお勧めします。

//...
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.DependencyInjection;
//...

public Test GetSystemUnderTest() {
    var services = new ServiceCollection();
    services.AddMemoryCache();
    var serviceProvider = services.BuildServiceProvider();

    var memoryCache = serviceProvider.GetService<IMemoryCache>();
    return new Test(memoryCache);
}

[Fact]
public void TestCache() {
    //Arrange
    var sut = GetSystemUnderTest();

    //Act
    sut.SetCache("key", "value");

    //Assert
    //...
}

これで、完全に機能するメモリ キャッシュにアクセスできるようになりました。

おすすめ記事