如何使用Xamarin iOS TouchRunner在UI线程上对异步方法进行单元测试

如何使用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

我在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 (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流的相关框架。

您的“成功”异步单元测试可能不正确。当断言失败时,它的行为如何?它的行为似乎与预期的一样,我已经更新了问题,以显示初始测试的成功和失败结果。