Swift 测试:在 CLI 中执行“swift test”命令时出现“错误:无法在范围内找到”

问题描述 投票:0回答:1

我在 CLI 中执行

swift test
命令时遇到问题。

在我的测试中测试的类和结构在执行命令时无法识别,而在使用 XCode 接口执行时它们会通过。 (图片链接在帖子底部

这是我要测试的

AppManager
文件。

// AppManager.swift file
import Foundation
import Combine

public class AppManager {
    static let authenticated = PassthroughSubject<Bool, Never>()
    
    static func isAuthenticated() -> Bool {
        return UserDefaults.standard.string(forKey: "token") != nil
    }
    
    static func getUser() -> User? {
        if let data = UserDefaults.standard.data(forKey: "user") {
            do {
                let decoder = JSONDecoder()
                let user = try decoder.decode(User.self, from: data)
                
                return user
            } catch {
                print("Unable to Decode User (\(error))")
            }
        }
        
        return nil
    }
    
    static func getUserToken() -> String? {
        if let token = UserDefaults.standard.string(forKey: "token") {
            return token
        }
        
        return nil
    }
    
    static func getAppEnvironment() -> AppEnvironment {
        guard let savedData = UserDefaults.standard.data(forKey: "selectedAppEnvironment"),
              let decodedEnvironment = try? JSONDecoder().decode(AppEnvironment.self, from: savedData)
        else {
            return .defaultEnv
        }
        
        return decodedEnvironment
    }
}

这是其相关的测试文件

AppManagerTests.swift

// AppManagerTests.swift file
import XCTest

@testable import Tools

final class AppManagerTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Reset UserDefaults or set initial states here if necessary
        UserDefaults.standard.removeObject(forKey: "token")
        UserDefaults.standard.removeObject(forKey: "user")
        UserDefaults.standard.removeObject(forKey: "selectedAppEnvironment")
    }
    
    func testIsUserAuthenticated() {
        XCTAssertFalse(AppManager.isAuthenticated())
        
        let randomToken = UUID().uuidString
        UserDefaults.standard.set(randomToken, forKey: "token")
        
        XCTAssertTrue(AppManager.isAuthenticated())
    }
    
    func testGetUser() {
        XCTAssertNil(AppManager.getUser())
        
        let user = User(firstname: "John", lastname: "Doe", emailAddress: "[email protected]", roles: [User.UserRole.roleAdministrator], avatarImageUrl: "https://placehold.co/40", locale: "en")
        let encoder = JSONEncoder()
        if let userData = try? encoder.encode(user) {
            UserDefaults.standard.set(userData, forKey: "user")
        }
        
        XCTAssertEqual(AppManager.getUser(), user)
    }
    
    func testGetAppEnvironment() {
        XCTAssertEqual(AppManager.getAppEnvironment(), AppEnvironment.defaultEnv)
        
        let environment = AppEnvironment.devEnv
        let encoder = JSONEncoder()
        if let encodedData = try? encoder.encode(environment) {
            UserDefaults.standard.set(encodedData, forKey: "selectedAppEnvironment")
        }
        
        XCTAssertEqual(AppManager.getAppEnvironment(), AppEnvironment.devEnv)
    }
    
    override class func tearDown() {
        UserDefaults.standard.removeObject(forKey: "token")
        UserDefaults.standard.removeObject(forKey: "user")
        UserDefaults.standard.removeObject(forKey: "selectedAppEnvironment")
    }

}
// Package.swift file
import PackageDescription

let package = Package(
    name: "Tools",
    products: [
        .executable(name: "Tools", targets: ["Tools"])
    ],
    dependencies: [
        // Dependencies go here.
    ],
    targets: [
        .executableTarget(
            name: "Tools",
            dependencies: []),
        .testTarget(
            name: "ToolsTests",
            dependencies: ["Tools"],
            path: "ToolsTests"),
        .testTarget(
            name: "ToolsUITests",
            dependencies: ["Tools"],
            path: "ToolsUITests")
    ]
)

我将

Tools
ToolsTest
添加为
AppManager.swift
的目标会员资格。

你知道我错过了什么吗?谢谢你

Files and console error

swift xctest
1个回答
0
投票

在您的 Package.swift 文件中,您没有为主目标指定

path
值,如果您不使用
Sources

,则需要该值

所以添加

path: "."

以“工具”为目标

© www.soinside.com 2019 - 2024. All rights reserved.