Multithreading 如何使用TableServiceContext.BeginSaveChanges创建Silverlight单元测试?
我正在使用编写一个WindowsPhone7应用程序。我还使用创建了它的单元测试 现在,我想测试一段代码,它使用TableServiceContext.BeginSaveChanges方法将数据保存到azure表中(没有可用的同步SaveChanges方法) 我需要调用BeginSaveChanges并等待它以相同的测试方法完成,如下所示:Multithreading 如何使用TableServiceContext.BeginSaveChanges创建Silverlight单元测试?,multithreading,silverlight,windows-phone-7,Multithreading,Silverlight,Windows Phone 7,我正在使用编写一个WindowsPhone7应用程序。我还使用创建了它的单元测试 现在,我想测试一段代码,它使用TableServiceContext.BeginSaveChanges方法将数据保存到azure表中(没有可用的同步SaveChanges方法) 我需要调用BeginSaveChanges并等待它以相同的测试方法完成,如下所示: [Test] public void MyTest() { ICloudClientFactory factory = new CloudClien
[Test]
public void MyTest()
{
ICloudClientFactory factory = new CloudClientFactory();
ITableServiceContext context = factory.ResolveTableServiceContext("MyTable");
// add some entries here
UpdateContext(context);
AutoResetEvent autoResetEvent = new AutoResentEvent(false);
context.BeginSaveChanges((IAsyncResult result) =>
{
context.EndSaveChanges(result);
autoResetEvent.Set();
}, null);
bool set = autoResetEvent.WaitOne(TimeSpan.FromSeconds(5));
if (set)
{
Assert.Pass();
}
else
{
Assert.Fail();
}
}
autoResetEvent.WaitOne()仅在5秒超时过期时返回,并且仅在该超时过期后调用context.BeginSaveChanges的异步回调。
为什么呢
我还尝试在线程池中的线程上调用context.BeginSaveChanges(使用ThreadPool.QueueUserWorkItem方法),但没有任何帮助
此行为是否与Windows Phone 7/Silverlight有关
谢谢 ICloudClientFactory和ITableServiceContext都是接口。使用模拟代替直接访问实际的Azure云对象。这将删除外部依赖项(无论如何单元测试都不应该存在外部依赖项),并允许您单独测试代码 因此:
var mockContext=new Mock()
ITableServiceContext=mockContext.Object
这里有一个指向Moq快速启动的链接:ICloudClientFactory和ITableServiceContext都是接口。使用模拟代替直接访问实际的Azure云对象。这将删除外部依赖项(无论如何单元测试都不应该存在外部依赖项),并允许您单独测试代码 因此:
var mockContext=new Mock()
ITableServiceContext=mockContext.Object
这里是Moq快速入门的链接:感谢您的帮助!很明显,我用错了词,这不是我要创建的真正的单元测试,而是一个集成测试。我会考虑嘲笑我的依赖和编写一些单元测试,但是我也想让我的集成测试工作。我认为我的问题的根源是通过测试阻塞UI线程。在BeginContextSaveChanges的深处,必须有一个对UI线程的调用,该调用无法执行。一个解决方案可能是使用Silverlight测试框架,我猜是(),但最终还是使用了自定义的解决方法。我有一个对象,我们称之为TestHarnesState。因此,每个测试线束在设置期间都会在那里注册其测试(thState.RegisterTest(“testX”))。在回调中,线束的每个测试都调用thState.TestFinished(“testX”)。我更新了测试运行程序以启动一个计时器,该计时器每秒检查是否所有测试都已完成(thState.AllTestsFinished),并且仅当测试完成时才会显示结果页面。这对我来说很好。谢谢你的帮助!很明显,我用错了词,这不是我要创建的真正的单元测试,而是一个集成测试。我会考虑嘲笑我的依赖和编写一些单元测试,但是我也想让我的集成测试工作。我认为我的问题的根源是通过测试阻塞UI线程。在BeginContextSaveChanges的深处,必须有一个对UI线程的调用,该调用无法执行。一个解决方案可能是使用Silverlight测试框架,我猜是(),但最终还是使用了自定义的解决方法。我有一个对象,我们称之为TestHarnesState。因此,每个测试线束在设置期间都会在那里注册其测试(thState.RegisterTest(“testX”))。在回调中,线束的每个测试都调用thState.TestFinished(“testX”)。我更新了测试运行程序以启动一个计时器,该计时器每秒检查是否所有测试都已完成(thState.AllTestsFinished),并且仅当测试完成时才会显示结果页面。这对我来说很好。
var mockContext = new Mock<ITableServiceContext>()
ITableServiceContext context=mockContext.Object