コード例 #1
0
    public async Task GetOrCreateAsync_OK()
    {
        // arrange
        const string encoded       = "\"blob\"";
        var          expectedBytes = Encoding.UTF8.GetBytes(encoded);
        var          cache         = new Mock <IDistributedCache>();

        cache.Setup(m => m.GetAsync(It.IsAny <string>(), It.IsAny <CancellationToken>())).ReturnsAsync((byte[])null);
        var memory = new Mock <IMemoryCache>();
        var entry  = new Mock <ICacheEntry>();

        memory.Setup(m => m.CreateEntry(It.IsAny <object>())).Returns(entry.Object);
        var svc = new DualLayerCacheService(cache.Object, memory.Object, new NullLogger <DualLayerCacheService>(), _opts);

        // act
        const string obj = "blob";
        var          _   = await svc.GetOrCreateAsync("test", _ => Task.FromResult(obj));

        // assert
        cache.Verify(m => m.GetAsync("test", It.IsAny <CancellationToken>()));
        cache.Verify(m => m.SetAsync("test", It.Is <byte[]>(x => x.SequenceEqual(expectedBytes)), It.IsAny <DistributedCacheEntryOptions>(), It.IsAny <CancellationToken>()));
        cache.VerifyNoOtherCalls();
        entry.VerifySet(m => m.Value = obj);
        entry.VerifySet(m => m.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(_opts.Value.DefaultMemoryExpirySeconds));
        entry.Verify(m => m.Dispose());
        entry.VerifyNoOtherCalls();
        object val;

        memory.Verify(m => m.TryGetValue("test", out val));
        memory.Verify(m => m.CreateEntry("test"));
        memory.VerifyNoOtherCalls();
    }
コード例 #2
0
    public async Task GetOrCreateAsync_Generic_OK()
    {
        // arrange
        const string encoded       = "{\"Id\":1,\"Name\":\"Test\"}";
        var          expectedBytes = Encoding.UTF8.GetBytes(encoded);
        var          cache         = new Mock <IDistributedCache>();

        cache.Setup(m => m.GetAsync(It.IsAny <string>(), It.IsAny <CancellationToken>())).ReturnsAsync((byte[])null);
        var memory = new Mock <IMemoryCache>();
        var logger = new Mock <ILogger <DualLayerCacheService> >();

        logger.Setup(m => m.IsEnabled(LogLevel.Trace)).Returns(true);
        var entry = new Mock <ICacheEntry>();

        memory.Setup(m => m.CreateEntry(It.IsAny <object>())).Returns(entry.Object);
        var          svc = new DualLayerCacheService(cache.Object, memory.Object, logger.Object, _opts);
        const string key = "test";

        // act
        var obj = new MyClass {
            Id = 1, Name = "Test"
        };
        var _ = await svc.GetOrCreateAsync(key, opts =>
        {
            opts.AbsoluteExpirationRelativeToNow = TimeSpan.FromDays(1);
            return(Task.FromResult(obj));
        });

        // assert
        cache.Verify(m => m.GetAsync(key, It.IsAny <CancellationToken>()));
        cache.Verify(m => m.SetAsync(key, It.Is <byte[]>(x => x.SequenceEqual(expectedBytes)), It.IsAny <DistributedCacheEntryOptions>(), It.IsAny <CancellationToken>()));
        cache.VerifyNoOtherCalls();
        entry.VerifySet(m => m.Value = obj);
        entry.VerifySet(m => m.AbsoluteExpirationRelativeToNow = TimeSpan.FromSeconds(_opts.Value.DefaultMemoryExpirySeconds));
        entry.Verify(m => m.Dispose());
        entry.VerifyNoOtherCalls();
        object val;

        memory.Verify(m => m.TryGetValue(key, out val));
        memory.Verify(m => m.CreateEntry(key));
        memory.VerifyNoOtherCalls();

        logger.Verify(m => m.IsEnabled(LogLevel.Trace));
        logger.Verify(m => m.Log(LogLevel.Trace, It.IsAny <EventId>(),
                                 It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Distributed Cache operation requested ({CacheOperation.Get}) => {key}"),
                                 null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        logger.Verify(m => m.Log(LogLevel.Trace, It.IsAny <EventId>(),
                                 It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Distributed Cache operation requested ({CacheOperation.Set}) => {key}"),
                                 null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));

        logger.VerifyNoOtherCalls();
    }
コード例 #3
0
    public async Task GetOrCreateAsync_Generic_InMem_OK()
    {
        // arrange
        var obj = new MyClass {
            Id = 1, Name = "Test"
        };
        var          o     = (object)obj;
        const string key   = "test";
        var          cache = new Mock <IDistributedCache>();

        cache.Setup(m => m.GetAsync(It.IsAny <string>(), It.IsAny <CancellationToken>())).ReturnsAsync((byte[])null);
        var memory = new Mock <IMemoryCache>();
        var logger = new Mock <ILogger <DualLayerCacheService> >();

        logger.Setup(m => m.IsEnabled(LogLevel.Trace)).Returns(true);
        var entry = new Mock <ICacheEntry>();

        memory.Setup(m => m.CreateEntry(It.IsAny <object>())).Returns(entry.Object);
        memory.Setup(m => m.TryGetValue(key, out o)).Returns(true);
        var svc = new DualLayerCacheService(cache.Object, memory.Object, logger.Object, _opts);

        // act
        var _ = await svc.GetOrCreateAsync(key, _ => Task.FromResult(obj));

        // assert
        cache.VerifyNoOtherCalls();
        entry.VerifyNoOtherCalls();
        object val;

        memory.Verify(m => m.TryGetValue(key, out val));
        memory.VerifyNoOtherCalls();

        logger.Verify(m => m.IsEnabled(LogLevel.Trace));
        logger.Verify(m => m.Log(LogLevel.Trace, It.IsAny <EventId>(),
                                 It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Distributed Cache operation requested ({CacheOperation.Get}) => {key}"),
                                 null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));
        logger.Verify(m => m.Log(LogLevel.Trace, It.IsAny <EventId>(),
                                 It.Is <It.IsAnyType>((obj, t) => obj.ToString() == $"Distributed Memory Cache Hit => {key}"),
                                 null, (Func <It.IsAnyType, Exception, string>)It.IsAny <object>()));

        logger.VerifyNoOtherCalls();
    }