You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:02:25