1

コンソール アプリケーションでは、項目がキャッシュに追加または削除された場合に、キャッシュ クラスターから正常にコールバックを取得できます。

テスト駆動環境で同じテストを実行するにはどうすればよいですか。テスト ケースを作成すると、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);
    }
4

1 に答える 1

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秒間待機するのではなく、コールバックが発生したときにテストスレッドが進行するようにしました。

于 2012-11-13T18:07:00.467 に答える