テスト自動化と品質担保の強化

- CalendarServiceに対するユニットテスト(ロード、保存の挙動)を実装
- Makefileにtestターゲットを追加し、コマンドラインからテスト実行を可能化
- Xcodeプロジェクト(yml)にテストターゲット(OreCalendarTests)とtest定義を追加
This commit is contained in:
2025-10-28 16:26:55 +09:00
parent 4d2f90f88d
commit 64d1afba83
3 changed files with 66 additions and 1 deletions

View File

@@ -1,4 +1,4 @@
.PHONY: generate build all .PHONY: generate build all test
all: build all: build
@@ -7,6 +7,9 @@ generate:
build: generate build: generate
xcodebuild -scheme OreCalendar -destination 'platform=macOS' -derivedDataPath build build xcodebuild -scheme OreCalendar -destination 'platform=macOS' -derivedDataPath build build
test: generate
xcodebuild test -scheme OreCalendar -destination 'platform=macOS' -derivedDataPath build
release: build release: build
rm -rf ~/Applications/OreCalendar.app ; true rm -rf ~/Applications/OreCalendar.app ; true
mv build/Build/Products/Release/OreCalendar.app ~/Applications/OreCalendar.app mv build/Build/Products/Release/OreCalendar.app ~/Applications/OreCalendar.app

View File

@@ -0,0 +1,50 @@
import XCTest
import EventKit
@testable import OreCalendar
@MainActor
final class CalendarServiceTests: XCTestCase {
var service: CalendarService!
let testKey = "selectedCalendars"
override func setUp() async throws {
try await super.setUp()
service = CalendarService()
UserDefaults.standard.removeObject(forKey: testKey)
}
override func tearDown() async throws {
UserDefaults.standard.removeObject(forKey: testKey)
service = nil
try await super.tearDown()
}
func testLoadDefaultSelectedCalendars_withSavedCalendars() async throws {
let savedCalendarIDs = ["calendar1", "calendar2", "calendar3"]
UserDefaults.standard.set(savedCalendarIDs, forKey: testKey)
service.loadDefaultSelectedCalendars()
XCTAssertEqual(service.selectedCalendars, Set(savedCalendarIDs))
}
func testLoadDefaultSelectedCalendars_withoutSavedCalendars() async throws {
UserDefaults.standard.removeObject(forKey: testKey)
service.loadDefaultSelectedCalendars()
let expectedCalendarIDs = Set(service.availableCalendars.map { $0.calendarIdentifier })
XCTAssertEqual(service.selectedCalendars, expectedCalendarIDs)
}
func testSaveSelectedCalendars() async throws {
let testCalendarIDs = ["cal1", "cal2", "cal3"]
service.selectedCalendars = Set(testCalendarIDs)
service.saveSelectedCalendars()
let savedCalendars = UserDefaults.standard.array(forKey: testKey) as? [String]
XCTAssertNotNil(savedCalendars)
XCTAssertEqual(Set(savedCalendars!), Set(testCalendarIDs))
}
}

View File

@@ -11,6 +11,9 @@ schemes:
config: Release config: Release
archive: archive:
config: Release config: Release
test:
targets:
- OreCalendarTests
targets: targets:
OreCalendar: OreCalendar:
platform: macOS platform: macOS
@@ -29,4 +32,13 @@ targets:
ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon ASSETCATALOG_COMPILER_APPICON_NAME: AppIcon
INFOPLIST_KEY_NSCalendarsUsageDescription: "カレンダーのイベントを表示するためにアクセスが必要です" INFOPLIST_KEY_NSCalendarsUsageDescription: "カレンダーのイベントを表示するためにアクセスが必要です"
INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription: "カレンダーのイベントを表示するためにフルアクセスが必要です" INFOPLIST_KEY_NSCalendarsFullAccessUsageDescription: "カレンダーのイベントを表示するためにフルアクセスが必要です"
OreCalendarTests:
platform: macOS
type: bundle.unit-test
sources:
- Tests
dependencies:
- target: OreCalendar
settings:
GENERATE_INFOPLIST_FILE: true