private static void TestLoadWithCallback(ICacheController cache, CacheDataController data) { var loadNotificationCount = 0; var startStatusReceived = false; var completeStatusRecieved = false; var mre = new ManualResetEvent(false); Action<LoadingStatus, int, string> callback = (status, loadingKey, loadingMessage) => { switch (status) { case LoadingStatus.Starting: startStatusReceived = true; break; case LoadingStatus.Loading: break; case LoadingStatus.Loaded: completeStatusRecieved = true; break; default: throw new ArgumentOutOfRangeException("status"); } // ReSharper disable AccessToModifiedClosure loadNotificationCount++; // ReSharper restore AccessToModifiedClosure }; cache.SetupLoadNotification(typeof(TestCacheData), CacheNotificationAction.Add, callback); var callbackRaised = false; data.LoadWithCallback(() => { callbackRaised = true; mre.Set(); }); mre.WaitOne(1000); Assert.IsTrue(callbackRaised, "Callback was not raised"); Assert.IsTrue(startStatusReceived, "Start status missing"); Assert.IsTrue(loadNotificationCount == 2, "There should be 2 LoadNotification messages"); Assert.IsTrue(completeStatusRecieved, "Complete status missing"); cache.SetupLoadNotification(typeof(TestCacheData), CacheNotificationAction.Remove, callback); // Return to a IsCached = false state cache.Invalidate(); }