Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 模拟AppFabric缓存回调的测试用例_C#_Testdriven.net_Appfabric Cache - Fatal编程技术网

C# 模拟AppFabric缓存回调的测试用例

C# 模拟AppFabric缓存回调的测试用例,c#,testdriven.net,appfabric-cache,C#,Testdriven.net,Appfabric Cache,在控制台应用程序中,如果在缓存中添加或删除项目,我可以成功从缓存群集获得回调 如何在测试驱动环境中执行相同的测试当我编写测试用例时,我不会让OnCacheChange触发。 请帮忙 谢谢 以下代码在控制台应用程序中工作 static void Main(string[] args) { dtStart = DateTime.Now; dtEnd = DateTime.MinValue; string line; v

在控制台应用程序中,如果在缓存中添加或删除项目,我可以成功从缓存群集获得回调

如何在测试驱动环境中执行相同的测试当我编写测试用例时,我不会让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);
    }

从您的问题范围来看,不清楚测试回调是否实际触及了
\u 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);

上面我以lambda的形式内联编写了回调,因此很明显,
\u eventFired
会在回调中得到更新。我还使用了一个
ManualResetEvent
,这样当回调被触发时,测试线程将继续进行,而不是等待硬编码的10秒。

从您的问题范围来看,测试回调是否实际涉及
\u 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);

上面我以lambda的形式内联编写了回调,因此很明显,
\u eventFired
会在回调中得到更新。我还使用了
ManualResetEvent
,以便在启动回调时测试线程继续进行,而不是等待硬编码的10秒。

您遇到了什么错误/问题?这是一个编译时错误,还是其他什么?我没有得到任何错误,除了在测试用例中从未触发OnCacheChange。。然而,在控制台应用程序中,当我让控制台应用程序运行时,OnCacheChange会在大约10秒后被触发……我假设您已经尝试将超时时间增加到20秒,可以肯定吗?更新了最后几行代码如下:Assert.AreEqual(“我的值1”,cache.Get(key1));如果(!reset.WaitOne(TimeSpan.FromSeconds(100)){抛出新异常(“10秒后未收到缓存回调”);}System.Threading.Thread.Sleep(60000);Assert.IsTrue(eventFired);我正在进行4分240秒的测试,看看是否有效。可能是我的群集服务器响应缓慢。您遇到了什么错误/问题?这是一个编译时错误,还是其他什么?我没有得到任何错误,除了在测试用例中从未触发OnCacheChange。。然而,在控制台应用程序中,当我让控制台应用程序运行时,OnCacheChange会在大约10秒后被触发……我假设您已经尝试将超时时间增加到20秒,可以肯定吗?更新了最后几行代码如下:Assert.AreEqual(“我的值1”,cache.Get(key1));如果(!reset.WaitOne(TimeSpan.FromSeconds(100)){抛出新异常(“10秒后未收到缓存回调”);}System.Threading.Thread.Sleep(60000);Assert.IsTrue(eventFired);我正在进行4分240秒的测试,看看是否有效。可能是我的群集服务器响应缓慢。dbaseman当我从缓存中添加/删除项时,回调仍然没有被触发。dbaseman当我从缓存中添加/删除项时,回调仍然没有被触发。