MemoryCache.Default.AddOrGetExisiting returns null 尽管密钥在缓存中

MemoryCache.Default.AddOrGetExisiting returns null although the key is in the cache

我正在为我的 asp.net 网络 API 应用程序编写单元测试,其中一个正在尝试验证 AddOrGetExisting 是否正常工作。根据 MSDN 文档,AddOrGetExisting return 是一个项目,如果它已经保存,如果没有,它应该将它写入缓存。

我遇到的问题是,如果我从单元测试中将密钥添加到 MemoryCache 对象,然后调用 AddOrGetExisting,它将始终 return null 并覆盖值而不是 returning已经保存的值。在我调用 AddOrGetExisting(bool isIn 计算结果为真)之前,我正在验证该值是否在缓存中。

这是我的内存缓存代码和测试方法。任何帮助将不胜感激:

public static class RequestCache
{
    public static TEntity GetFromCache<TEntity>(string key, Func<TEntity> valueFactory) where TEntity : class
    {
        ObjectCache cache = MemoryCache.Default;
        var newValue = new Lazy<TEntity>(valueFactory);
        CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60) };
        bool isIn = cache.Contains(key);
        // Returns existing item or adds the new value if it doesn't exist
        var value = cache.AddOrGetExisting(key, newValue, policy) as Lazy<TEntity>;
        return (value ?? newValue).Value;
    }

}

    public string TestGetFromCache_Helper()
    {
        return "Test3and4Values";
    }

    [TestMethod]
    public void TestGetFromCache_ShouldGetItem()
    {
        ObjectCache cache = MemoryCache.Default;
        CacheItemPolicy policy = new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(60) };
        var cacheKey = "Test3";
        var expectedValue = "Test3Value";
        cache.AddOrGetExisting(cacheKey, expectedValue, policy);

        var result = Models.RequestCache.GetFromCache(cacheKey,
            () =>
                {
                    return TestGetFromCache_Helper();
                 });

        Assert.AreEqual(expectedValue, result);
    }

问题可能是您在 RequestCache.GetFromCache 中将 Lazy<TEntity> 作为 newValue 传递,但在测试方法中将 string 作为 expectedValue 传递.

当 运行 测试时,cache.Contains(key) 确认为该键存储了一个值,这是真的。但是它是 string 而不是 Lazy<TEntity>。显然 AddOrGetExisting 决定在这种情况下覆盖该值。

针对此特定情况的解决方法可能是将测试中的 expectedValue 赋值调整为如下所示:

var expectedValue = new Lazy<string>(TestGetFromCache_Helper);

您还需要在测试的最终相等性比较中从 Lazy 中提取值,例如:

Assert.AreEqual(expectedValue.Value, result);