帮助在Silverlight中编写异步单元测试

本文关键字:异步 单元测试 Silverlight 帮助 | 更新日期: 2023-09-27 18:09:09

我正在尝试编写一个异步Silverlight单元测试,如http://developer.yahoo.com/dotnet/silverlight/2.0/unittest.html所述。也许我正在与lambda表达式作斗争,我不确定,但我不清楚如何编写我的命名回调,以便异步测试毫无例外地完成。当前它抛出一个System。调用TestComplete()中的UnauthorizedAccessException(无效的跨线程访问),我猜是因为它不知道它还在testNullInsert()测试?

问题-我如何正确地编写测试,如果我需要lambda表达式,请解释一下什么是什么。

下面是我目前为止的代码:
[TestClass]
public class IdentityEditDatabaseTest : WorkItemTest
{
  [TestMethod, Asynchronous] public void testNullInsert()
  {
    wipeTestData(testNullInsertContinue1);
  }
  private void testNullInsertContinue1(String errorString)
  {
    IdentityProperties properties = new IdentityProperties(getContext());
    properties.setUserName(DATABASE_TEST);
    postUserEdit(properties, testNullInsertContinue2);
  }
  private void testNullInsertContinue2(String errorString)
  {
    Assert.assertTrue(errorString == null);
    wipeTestData(testNullInsertContinue3);
  }
  private void testNullInsertContinue3(String errorString)
  {
    TestComplete();
  }
}

谢谢!

编辑:正确的代码在下面,感谢@ajmccall的链接!

[TestClass]
public class IdentityEditDatabaseTest : DatabaseTestCase
{
  [TestMethod, Asynchronous] public void testNullInsert()// throws Throwable
  {
    EnqueueCallback(() => wipeTestData(errorString1 => {
    IdentityProperties properties = new IdentityProperties(getContext());
    properties.setUserName(DATABASE_TEST);
    EnqueueCallback(() => postUserEdit(properties, errorString2 => {
    Assert.assertTrue(errorString2 == null);
    EnqueueCallback(() => wipeTestData(errorString3 => {
    EnqueueTestComplete();
  }));
  }));
  }));
  }

帮助在Silverlight中编写异步单元测试

我认为@Anthony在建议TestComplete()对UI线程进行一些调用时是正确的,并且由于它是从后台线程调用的(因为它是回调),因此会导致抛出此异常。

从现在阅读文档来看,它说[Asynchronous]标签

测试只在TestComplete方法被调用后才完成,而不是在该方法退出时完成。您的测试类必须继承SilverlightTest才能执行异步测试

您可以尝试将TestComplete()行放在testNullInsert方法的末尾。这可能不会抛出异常,但我认为它不会正确执行测试。您最终想要做的是有一个测试方法,它执行以下步骤,

  • 清除测试数据并等待直到它完成-这不是测试,所以不关心结果,但我们仍然必须使用AutoResetEvent等待或在回调中继续
  • 定义要测试的回调
  • 添加回调到单元测试队列-使用EnqueueCallback()
  • 等待回调完成并存储结果-使用enqueueconconditional ()
  • 通过调用EnqueueTestComplete()
  • 通知unti测试框架你已经完成

如果你能把你的测试重写成像这样的东西,那么我认为你就在为你的代码编写异步单元测试的路上了。

欢呼,Al .

将在TestComplete上发生的事情之一是UI将被更新。然而,显然TestComplete方法(或它最终与之交互的UI代码)不期望在非UI线程上被调用。

因此,它似乎是由你来确保调用TestComplete在UI线程上执行:-

  private void testNullInsertContinue3(String errorString)
  {
       Deployment.Current.Dispatcher.BeginInvoke(TestComplete); 
  }