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
相关产品推荐
相关产品推荐

