C# 模拟AppFabric缓存回调的测试用例
在控制台应用程序中,如果在缓存中添加或删除项目,我可以成功从缓存群集获得回调 如何在测试驱动环境中执行相同的测试当我编写测试用例时,我不会让OnCacheChange触发。 请帮忙 谢谢 以下代码在控制台应用程序中工作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
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当我从缓存中添加/删除项时,回调仍然没有被触发。