【问题标题】:How to assert an error is thrown async when testing?测试时如何断言异步抛出错误?
【发布时间】:2020-02-26 06:00:44
【问题描述】:

我们可以使用XCTAssertThrowsError 测试抛出的错误。可以使用expectation 测试异步事物。我有一些方法可以将工作分派到后台线程,并且在某些时候会抛出错误。

是否有可能在将来某个地方抛出错误?我想我需要结合expectationXCTAssertThrowsError,但我不知道如何。

复制项目:https://github.com/Jasperav/ThrowingAsyncError。只需克隆项目并运行测试,其中一个会失败。我做了一个类,它会在分配后几秒钟后崩溃。我想确保它在几秒钟后继续崩溃,所以我想要一个测试用例。

【问题讨论】:

  • 如果您的测试抛出的函数。你不应该只是做一个做/抓住。
  • @Amerino 在方法异步时不起作用。
  • @J.Doe 可以提供一些示例代码吗?这可能会更容易理解这个背景工作是如何使用的。例如,这个后台工作是否使用完成处理程序等调用?
  • 你能不能让你的单元测试也抛出?然后,如果异步调用在单元测试中抛出,假设您没有捕获错误,它将导致测试失败。
  • @AnthonyDito 好的,我做了一个,看看我的编辑

标签: swift unit-testing xctest


【解决方案1】:

我查看了复制项目,看看你想在这里完成什么......

据我了解:

XCTAssertThrowsError 是接受可以抛出的块的断言。他们只是碰巧断言在同步块运行完成时会引发错误。

XCTestExpectation 是跟踪是否满足请求条件的类。它们用于跟踪异步代码行为对象/引用需要保留并稍后检查。

你似乎想要做的是让 XCTestExpectation 之类的东西像 XCTAssertThrowsError 一样工作,就像在做一个 同步 断言异步块将抛出。由于代码的运行和返回方式,它不会那样工作。

您引用的异步代码不会抛出(计时器初始化程序)。据我所知,没有任何可以抛出的异步块。也许您应该问的问题是,我们如何才能让同步操作选择有时同步运行,但在感觉像...时也选择异步运行...

另外,对于您想要测试的每个课程的一些额外复杂性,我已经制作了一个几乎是最低限度的解决方案,以使其易于测试和便携......

https://github.com/Jasperav/ThrowingAsyncError/pull/1/files

请问你为什么想做这样的事情?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-11
    • 2019-07-01
    • 2019-04-01
    • 2013-03-16
    • 2019-09-05
    • 1970-01-01
    • 2019-02-19
    相关资源
    最近更新 更多