2012-11-13 2 views
1

В консольное приложение, я могу успешно получить вызов обратно из кэша кластера в случае добавляется или удаляется из кэша элемент.Тестовый пример для имитации вызова кэша назад для AppFabric

Как выполнить тот же тест в среде Test Driven. Когда я пишу тестовый пример, я не могу запустить OnCacheChange.

Пожалуйста, помогите.

Спасибо ..

Следующий код работает в консольное приложение ...

static void Main(string[] args) 
    { 
     dtStart = DateTime.Now; 
     dtEnd = DateTime.MinValue; 

     string line; 
     var factory = new DataCacheFactory(); 
     var key = "mycachekey1"; 
     var cache = factory.GetCache("default"); 
     var d = cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem | DataCacheOperations.ReplaceItem, OnCacheChange); 
     Console.WriteLine("Cache Name = {0} : DelegateId = {1}",d.CacheName,d.DelegateId); 
     var obj = cache[key]; 
     if (obj == null) 
     { 
      Console.WriteLine("data was not cached."); 
      Console.WriteLine("Enter your data to be cached."); 
      line = Console.ReadLine(); 
      cache.Add(key, line); 
     } 

     Console.WriteLine("getting data from cache: {0}", cache[key]); 

     Console.WriteLine("type yes to remove data for cache key {0} : ", key); 
     line = Console.ReadLine(); 
     if (line.ToString().Length > 0) 
     { 
      cache.Remove(key); 
      Console.WriteLine("cache removed"); 
      Console.ReadLine(); 
     } 


    } 


    static void OnCacheChange(string cacheName, string region, string key, DataCacheItemVersion itemVersion, DataCacheOperations operationId, DataCacheNotificationDescriptor notificationDescriptor) 
    { 
     dtEnd = DateTime.Now; 
     TimeSpan timeSpan = dtEnd - dtStart; 
     Console.WriteLine("Event to be fired in seconds = {0}", timeSpan.Seconds); 

     Console.WriteLine("A cache-level notification has been triggered. Following are the details:"); 
     Console.WriteLine("Cache: " + cacheName); 
     Console.WriteLine("Region: " + region); 
     Console.WriteLine("Key: " + key); 
     Console.WriteLine("Operation: " + operationId.ToString()); 
     Console.WriteLine("Notification Description: " + notificationDescriptor.DelegateId); 
     Console.WriteLine("Finished executing the cache notification callback."); 
    } 

После TestMethod не может стрелять событие OnCacheChange.

[TestMethod] 
    public void CacheCallBackFunctionTest() 
    { 
     _eventFired = false; 
     _startDateTime = DateTime.Now; 

     var key = "mycachekey2"; 
     var cache = CachingManager.CacheFactory().GetCache("default"); 
     cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem | DataCacheOperations.ReplaceItem, OnCacheChange); 
     cache.Add(key, "my value 1"); 
     cache.Remove(key); 
     System.Threading.Thread.Sleep(10000); 
     Assert.IsTrue(_eventFired); 
    } 
+0

Какая ошибка/проблема у вас есть? Это ошибка времени компиляции или что-то еще? – McGarnagle

+0

У меня нет никакой ошибки, за исключением того, что OnCacheChange никогда не запускается в тестовом примере. Как всегда, в консольном приложении, когда я покидаю консольное приложение, OnCacheChange запускается после 10 секунд или около того ... –

+0

I предположим, что вы попытались увеличить тайм-аут до 20 секунд, чтобы быть уверенным? – McGarnagle

ответ

1

Это не ясно из сферы вашего вопроса о том, что тест обратного вызова на самом деле прикасаясь _eventFired. Это должно работать, однако:

bool eventFired = false; 
var reset = new System.Threading.ManualResetEvent(true); 
cache.AddCacheLevelCallback(DataCacheOperations.AddItem | DataCacheOperations.RemoveItem, 
    (cacheName, region, key, itemVersion, operationId, notificationDescriptor) => { 
     eventFired = true; 
     reset.Set(); 
    }); 

cache.Add(key, "my value 1"); 
if (!reset.WaitOne(TimeSpan.FromSeconds(10))) 
{ 
    throw new Exception("Didn't receive cache callback after 10 seconds"); 
} 
Assert.IsTrue(eventFired); 

Выше я написал обратного вызова в линию как лямбда, так что это ясно _eventFired обновляется на обратный вызов. Я также использовал ManualResetEvent, так что тестовая нить продолжается при обратном вызове, а не в ожидании жестко закодированных 10 секунд.

+0

dbaseman Обратный вызов по-прежнему не срабатывает, когда я добавляю/удаляю элемент из кеша. –

+1

Я провел тест на 10 минут, и это сработало. Благодарю. –

+0

@ dotnet-practitioner круто ... Я был свежим из идей. – McGarnagle

Смежные вопросы