2014-12-04 6 views
0

다음 테스트는 간헐적으로 실패합니다. 절대 만기 시간과 항목이 제거되기 전에 호출되어야하는 업데이트 콜백을 사용하여 MemoryCache에 항목을 캐시합니다. 그러나 때때로 콜백은 테스트가 끝나기 전에 호출되기도하고 때로는 전혀 호출되지 않을 수도 있습니다.MemoryCache UpdateCallback을 사용하여 테스트

버퍼 시간이 충분하면 항상 적어도 한 번 호출됩니다. 하지만 캐시가 만료되기 전에 항상 데이터를 업데이트해야하므로 캐시가 내 목적을 달성하지 못합니다.

지금 실제 시나리오에서는 10 초 만료 시간과 세분성을 갖지 않지만이 테스트가 간헐적으로 실패한다는 것은 여전히 ​​저를 귀찮게합니다.

왜 이런 일이 발생했는지 생각해보십시오.

참고 : 또한 60 초 만료 및 5 초 버퍼로 간헐적으로 실패합니다.

using System; 
using System.Runtime.Caching; 
using System.Threading.Tasks; 
using Microsoft.VisualStudio.TestTools.UnitTesting; 

[TestClass] 
public class MemoryCacheTest 
{ 
    private const double ExpiryInSeconds = 10; 
    private const double ExpiryBufferInSeconds = 5; 

    private readonly object updateItemCounterLock = new object(); 
    private int updateItemCounter = 0; 

    [TestMethod] 
    public async Task MemoryCacheUpdateTest() 
    { 
     // Set item in cache with absolute expiration defined above 
     MemoryCache cache = MemoryCache.Default; 
     CacheItem cacheItem = new CacheItem("key", "value"); 
     CacheItemPolicy cacheItemPolicy = new CacheItemPolicy 
     { 
      AbsoluteExpiration = DateTimeOffset.Now + TimeSpan.FromSeconds(ExpiryInSeconds), 
      UpdateCallback = new CacheEntryUpdateCallback(this.UpdateItem) 
     }; 
     cache.Set(cacheItem, cacheItemPolicy); 

     // Delay for absolute expiration time + buffer 
     await Task.Delay(TimeSpan.FromSeconds(ExpiryInSeconds) + TimeSpan.FromSeconds(ExpiryBufferInSeconds)); 

     // Test that the update callback was invoked once 
     Assert.AreEqual(1, updateItemCounter); 
    } 

    // Incrememnts the updateItemCounter 
    private void UpdateItem(CacheEntryUpdateArguments args) 
    { 
     lock (updateItemCounterLock) 
     { 
      updateItemCounter++; 
     } 
    } 
} 
+0

눈에 띄면 AbsoluteExpiration 값은 항목을 제거한 후의 시간을 나타냅니다. 이것이 의미하는 바는 유효 기간이 최소 시간이며 절대 시간 (아이러니하게도)이 아닙니다. 여기서 절대적인 것은 그것이 미끄러지는 시간 제한이 아니라는 사실입니다. 그것은 정확한 순간에 축출 될 것입니다. 기본적으로 만료 후 언제든지 항목을 제거 할 수 있으며 몇 초 또는 몇 분이 지나야 수도 있습니다. 내 검사에 따르면 만료 시간이 만료 된 후 0 ~ 30 초 사이에 만료 될 수 있지만 길어질 수 있습니다. –

+1

이 게시물은 내부 구현에 일종의 하드 유선 20 초 타이머가 있음을 나타냅니다. http://stackoverflow.com/questions/12630168/memorycache-absoluteexpiration-acting-strange 맞는지 여부는 확실하지만 확실합니다. 테스트 결과에서 내가 보는 것과 일치합니다. –

답변

0

이 질문에 대한 해결책이 없으므로 필자는 필 요한 MemoryCache 메서드를 인터페이스에 추상화하고이를 테스트했습니다. 그 시점에서 인터페이스의 자체 구현을 테스트했을 것이기 때문에 테스트가 유효하지 않게되었습니다.

0

나는 새로운 CacheEntryUpdateCallback를 호출 가정 해 봅시다 것은 중복이다. UpdateCallback = new CacheEntryUpdateCallback (this.UpdateItem) 대신