私はasp net core 1.0とxunitを使用しています。
を使用するコードの単体テストを記述しようとしていますIMemoryCache
。ただし、 に値を設定しようとすると、IMemoryCache
Null 参照エラーが発生します。
私の単体テスト コードは次のようになります:
は、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 の値を設定しますか? IMemoryCache
Mocked の場合、デフォルト値は何ですか?
ベストアンサー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
//...
}
これで、完全に機能するメモリ キャッシュにアクセスできるようになりました。