帮助在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();
}));
}));
}));
}
我认为@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);
}