Multithreading 如何使用TableServiceContext.BeginSaveChanges创建Silverlight单元测试?

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

我正在使用编写一个WindowsPhone7应用程序。我还使用创建了它的单元测试

现在,我想测试一段代码,它使用TableServiceContext.BeginSaveChanges方法将数据保存到azure表中(没有可用的同步SaveChanges方法)

我需要调用BeginSaveChanges并等待它以相同的测试方法完成,如下所示:

[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