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

Swift Testing中.enabled(if:)调用实例辅助函数报错求解

Swift Testing框架中.enabled(if:) trait的使用问题解决

你在使用Swift Testing框架的.enabled(if:) trait时遇到错误:Instance member 'accessTokenIsNil' cannot be used on type 'AuthorizationTests'; did you mean to use a value of this type instead?,你的代码如下:

import Testing
@testable import mews
import SwiftUI

struct AuthorizationTests {
    let accessTokenManager = AccessTokenManager()
    
    func accessTokenIsNil() -> Bool {
        accessTokenManager.token == nil
    }
    
    @Test("Get initial access token", .enabled(if: accessTokenIsNil()))
    func getAccessTokenSucces() {
        // continue test
    }
}

对比苹果官方文档示例:

func allIngredientsAvailable(for food: Food) -> Bool { ... }

@Test(
  "Can make sundaes",
  .enabled(if: Season.current == .summer),
  .enabled(if: allIngredientsAvailable(for: .sundae))
)
func makeSundae() async throws { ... }

问题原因

@Test属性是在类型层面被处理的,此时AuthorizationTests的实例还未创建,因此无法访问实例成员(包括实例方法accessTokenIsNil和实例属性accessTokenManager)。而官方示例中的allIngredientsAvailable是全局函数,不属于任何类/结构体的实例成员,所以可以直接在@Test中调用。

解决方法

方案一:将方法和属性改为静态成员

把accessTokenManager和accessTokenIsNil都改为静态成员,这样就能在类型层面访问:

import Testing
@testable import mews
import SwiftUI

struct AuthorizationTests {
    static let accessTokenManager = AccessTokenManager()
    
    static func accessTokenIsNil() -> Bool {
        accessTokenManager.token == nil
    }
    
    @Test("Get initial access token", .enabled(if: accessTokenIsNil()))
    func getAccessTokenSucces() {
        // continue test
    }
}

方案二:内联判断逻辑

如果不需要复用判断逻辑,直接在.enabled(if:)中写判断代码:

import Testing
@testable import mews
import SwiftUI

struct AuthorizationTests {
    @Test("Get initial access token", .enabled(if: AccessTokenManager().token == nil))
    func getAccessTokenSucces() {
        // continue test
    }
}

内容的提问来源于stack exchange,提问作者phast

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:12