使用Quick/Nimble测试Swift异步函数时编译失败求助
Swift异步函数测试:Quick/Nimble编译错误解决
问题场景
在Xcode 14.2、Quick 6.1.0、Nimble 11.2.1的Swift Package环境中,尝试用Quick/Nimble编写异步函数单元测试时,出现编译错误:'async' call in an autoclosure that does not support concurrency。测试代码示例如下:
import Quick import Nimble struct Foo { func bar() async -> String { await Task { "Hello World" }.value } } final class FooSpec: QuickSpec { override func spec() { describe("A Foo") { describe("When calling Bar") { var foo: Foo! beforeEach { foo = Foo() } it("Says Hello World") { await expect( await foo.bar()) == "Hello World" } } } } }
错误原因
Nimble的expect(_:)默认接收的是非异步自动闭包(autoclosure),这类闭包不支持并发操作。直接在自动闭包中调用await foo.bar()会触发编译错误。同时,测试用例的闭包没有标记为async,无法在其中使用await关键字。
解决方案
修正测试代码,使用Nimble专门的异步断言API,并确保测试闭包为异步类型:
import Quick import Nimble struct Foo { func bar() async -> String { await Task { "Hello World" }.value } } final class FooSpec: QuickSpec { override func spec() { describe("A Foo") { describe("When calling Bar") { var foo: Foo! beforeEach { foo = Foo() } // 将测试闭包标记为async it("Says Hello World") async { // 使用闭包包裹异步调用,适配Nimble的异步expect重载 await expect { await foo.bar() }.to(equal("Hello World")) } } } } }
关键修正点
- 将
it的测试闭包标记为async,允许在闭包内使用await - 用
expect { ... }的闭包形式替代直接传入异步调用结果,该闭包支持异步操作,避免自动闭包的并发限制 - 使用
await调用异步的expect方法,再链式调用to(equal(...))完成断言
内容的提问来源于stack exchange,提问作者Lasse
相关产品推荐
相关产品推荐

