如何使用Xamarin iOS TouchRunner在UI线程上对异步方法进行单元测试
我在Xamarin中使用TouchRunner(NUnitLite)成功地实现了以下嵌套异步单元测试:如何使用Xamarin iOS TouchRunner在UI线程上对异步方法进行单元测试,ios,iphone,unit-testing,asynchronous,xamarin,Ios,Iphone,Unit Testing,Asynchronous,Xamarin,我在Xamarin中使用TouchRunner(NUnitLite)成功地实现了以下嵌套异步单元测试: [Test] [Timeout (Int32.MaxValue)] public async void NestedAsyncFail() { await Task.Run(async() => { await Task.Delay(1000); }); Assert.AreEqual(1, 0); } [Test] [Timeout
[Test]
[Timeout (Int32.MaxValue)]
public async void NestedAsyncFail()
{
await Task.Run(async() =>
{
await Task.Delay(1000);
});
Assert.AreEqual(1, 0);
}
[Test]
[Timeout (Int32.MaxValue)]
public async void NestedAsyncSuccess()
{
await Task.Run(async() =>
{
await Task.Delay(1000);
});
Assert.AreEqual(1, 1);
}
结果:
但是,如果我想测试一个异步方法,该方法需要执行一些逻辑,但也需要进行一些UI更改,从而在主线程上执行,该怎么办?下面是我的尝试,但是,有一些问题
[Test]
[Timeout (Int32.MaxValue)]
public void TestWithUIOperations()
{
bool result = false;
NSObject invoker = new NSObject ();
invoker.InvokeOnMainThread (async () => {
await SomeController.PerformUIOperationsAsync ();
result = true;
});
Assert.True (result);
}
使用Timeout属性时,TouchRunner可能由于某些线程锁定而冻结。如果没有Timeout属性,断言将返回false-我认为这是由于异步方法没有正确地等待
有人能告诉我哪里出了问题和/或如何做到这一点吗
我在第一次测试中使用Timeout属性的说明如下:
在类似的情况下,我使用了一个
AutoResetEvent
来测试我们的异步启动例程:
[Test]
public void CanExecuteAsyncTest()
{
AutoResetEvent resetEvent = new AutoResetEvent(false);
WaitHandle[] handles = new WaitHandle[] { resetEvent};
bool success = false;
Thread t = new Thread(() => {
Thread.Sleep(1000);
success = true;
resetEvent.Set();
});
t.Start ();
WaitHandle.WaitAll(handles);
Assert.Equal(true, success);
}
如果您正在测试UI功能,则最好使用或使用专用于测试UI流的相关框架。您的“成功”异步单元测试可能不正确。当断言失败时,它的行为如何?它的行为似乎与预期的一样,我已经更新了问题,以显示初始测试的成功和失败结果。