我在 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
的目标会员资格。
你知道我错过了什么吗?谢谢你
在您的 Package.swift 文件中,您没有为主目标指定
path
值,如果您不使用 Sources
,则需要该值
所以添加
path: "."
以“工具”为目标