Özellikleri Birleştirme ve Sınama
Reducer'ları birleştirin ve kapsamlı biçimde sınayın.
Özellikleri Birleştirme ve Sınama, CoddyKit'te ücretsiz bir Swift Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Swift Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Swift Academy kursu toplamda 4 dersten oluşur.
Özellikleri Birleştirme
Gerçek uygulamalar birçok küçük özellikten oluşur. TCA, bir üst özelliğin alt özellikleri içine gömmesine olanak tanır; böylece her özellik kendi görevine odaklanır ve ardından daha büyük bir bütün oluşturacak şekilde birleştirilir. Bunun araçları Scope ile alt durum ve eylemlerin gömülmesidir.
Birleştirme, Birleştirilebilir Mimari'ye adını veren şeydir.
import ComposableArchitecture
// A parent feature embeds child State and Action,
// then uses Scope to run the child's reducer.Alt Durumu Gömme
Üst özelliğin State değeri, alt özelliğin durumunu bir özellik olarak tutar. Üst özelliğin Action numaralandırması, alt özelliğin eylemlerini saran bir duruma sahiptir. Bu iç içe yapı, kullanıcı arayüzünün iç içe yapısını yansıtır.
Burada bir üst özellik, bir counter alt özelliğini tutar.
import ComposableArchitecture
@Reducer
struct AppFeature {
@ObservableState
struct State: Equatable {
var counter = CounterFeature.State()
}
enum Action {
case counter(CounterFeature.Action)
}
var body: some ReducerOf<Self> { EmptyReducer() }
}Alt Özelliğe Kapsam Daraltma
Scope, alt indirgeyiciyi kendisine ait üst durum ve eylem dilimi üzerinde çalıştırır. Ona bir durum anahtar yolunu ve eylem durum yolunu, ardından da alt indirgeyiciyi verirsiniz.
Bu, alt özelliği üst özelliğin güncelleme döngüsüne bağlar.
import ComposableArchitecture
var body: some ReducerOf<Self> {
Scope(state: \.counter, action: \.counter) {
CounterFeature()
}
Reduce { state, action in
// parent-specific logic here
return .none
}
}Birden Çok İndirgeyiciyi Birleştirme
Bir özelliğin body değeri birkaç indirgeyiciyi listeleyebilir; TCA bunları her eylem için sırayla çalıştırır. Böylece bir veya daha fazla Scope değerini üst özelliğin kendi Reduce değeriyle birlikte yerleştirebilirsiniz.
Burada iki alt özellik ile üst özellik mantığı birlikte bulunur.
import ComposableArchitecture
var body: some ReducerOf<Self> {
Scope(state: \.profile, action: \.profile) { ProfileFeature() }
Scope(state: \.settings, action: \.settings) { SettingsFeature() }
Reduce { state, action in
return .none
}
}Alt Görünümler İçin Depoya Kapsam Uygulama
Görünüm tarafında, alt görünümün alt özelliğe uyarlanmış bir depoya ihtiyacı vardır. Üst görünüm, store.scope ile alt özelliğin durumuna ve eylemine eşleyerek bunu türetir.
Burada üst görünüm, kapsamı daraltılmış bir depoyu counter görünümüne iletir.
import ComposableArchitecture
import SwiftUI
struct AppView: View {
let store: StoreOf<AppFeature>
var body: some View {
CounterView(
store: store.scope(state: \.counter, action: \.counter)
)
}
}TestStore'u Tanıtma
TestStore, bir özelliğin tam olarak nasıl davrandığını doğrulamanızı sağlar. Eylemler gönderir ve durumun nasıl değişmesi gerektiğini belirtirsiniz; gerçek durum farklıysa sınama başarısız olur. Bu kapsamlı kontrol, fark edilmesi zor gerilemeleri yakalar.
Onu, başlangıç durumu ve indirgeyiciyle normal bir depo gibi oluşturursunuz.
import ComposableArchitecture
import XCTest
func testIncrement() async {
let store = await TestStore(initialState: CounterFeature.State()) {
CounterFeature()
}
}Durum Değişikliklerini Doğrulama
Bir TestStore'a eylem gönderdiğinizde, beklenen değişikliği açıklayan bir kapanış iletirsiniz. Sınama ancak durum tam olarak bu şekilde değişirse başarılı olur.
Burada artırma işlemi sayacı 0'dan 1'e yükseltmelidir.
import ComposableArchitecture
import XCTest
func testIncrement() async {
let store = await TestStore(initialState: CounterFeature.State()) {
CounterFeature()
}
await store.send(.incrementTapped) {
$0.count = 1
}
}Eksiksizlik
Varsayılan olarak bir TestStore eksiksizdir: her durum değişikliğini ve bir efektin geri ilettiği her eylemi hesaba katmanız gerekir. Ele alınmayan değişiklikler sınamayı başarısız kılar; bu da doğrulamalarınızın gerçeği yansıtmasını sağlar.
Odaklanmış sınamalar için bunu store.exhaustivity = .off ile gevşetebilirsiniz.
import ComposableArchitecture
// Exhaustive (default): every change must be asserted.
// Relax when you only care about part of the behavior:
store.exhaustivity = .offEfekt Eylemlerini Alma
Bir efekt bir eylemi geri gönderdiğinde, sınamanın bu eylemi receive etmesi ve ortaya çıkan durumu doğrulaması gerekir. Bu, eşzamansız akışın baştan sona çalıştığını kanıtlar.
Burada yenileme, sınamanın bekleyip kontrol ettiği bir yanıtı tetikler.
import ComposableArchitecture
import XCTest
func testReload() async {
let store = await TestStore(initialState: NumberFeature.State()) {
NumberFeature()
}
await store.send(.reload)
await store.receive(\.response) {
$0.value = 42
}
}Sınamalarda Bağımlılıkları Geçersiz Kılma
Efektleri belirleyici hâle getirmek için TestStore'u oluştururken bağımlılıkları geçersiz kılın. Öngörülebilir sonuçlar elde etmek için sahte bir istemci veya sınama saati sağlayın.
Burada sayı istemcisi, her zaman 42 döndüren bir istemciyle değiştirilir.
import ComposableArchitecture
import XCTest
func testReload() async {
let store = await TestStore(initialState: NumberFeature.State()) {
NumberFeature()
} withDependencies: {
$0.numberClient.fetch = { 42 }
}
await store.send(.reload)
await store.receive(\.response) { $0.value = 42 }
}Birleştirilmiş Özellikleri Sınama
Birleştirme durumları ve eylemleri iç içe yerleştirdiği için, bir üst özelliği alt eylemleri üst durum içinde sarılmış olarak göndererek sınarsınız. Aynı eksiksiz doğrulamalar uygulanır ve bütün ağaç doğrulanır.
Burada bir üst özellik, kapsamı üzerinden gelen bir counter artırma eylemini alır.
import ComposableArchitecture
import XCTest
func testChildInParent() async {
let store = await TestStore(initialState: AppFeature.State()) {
AppFeature()
}
await store.send(.counter(.incrementTapped)) {
$0.counter.count = 1
}
}Hızlı Kontrol: TestStore Davranışı
Varsayılan bir TestStore'un doğrulamalarınızdan ne beklediğini hatırlayınız.
Özet: Birleştirme ve Sınama
TCA araç setini tamamladınız:
Scope, alt indirgeyiciyi üst durum ve eylemin bir dilimi üzerinde çalıştırır; ayrıca birkaç indirgeyici tek birbodyiçinde birleştirilebilir.store.scope, alt görünüme kendisine özel bir depo sağlar.TestStore, eylemlerisendile gönderdiğinizde durumdaki kesin değişiklikleri doğrular.- Varsayılan olarak eksiksizdir ve efektlerin yönlendirdiği eylemler için
receivekullanır. - Belirleyici sınamalar için bağımlılıkları
withDependenciesile geçersiz kılın.
Artık Birleştirilebilir Mimari ile özellikler oluşturabilir, birleştirebilir ve onları titizlikle sınayabilirsiniz.
import ComposableArchitecture
// Recap: Scope to compose, TestStore to verify.
// Exhaustive assertions + injected fakes = confidence.Sıkça Sorulan Sorular
“Özellikleri Birleştirme ve Sınama” dersi ücretsiz mi?
Evet — “Özellikleri Birleştirme ve Sınama” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Swift Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Swift Academy kursu toplamda 4 dersten oluşur.
“Özellikleri Birleştirme ve Sınama” dersinde ne öğreneceğim?
Reducer'ları birleştirin ve kapsamlı biçimde sınayın. Swift Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Swift Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Swift Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“Özellikleri Birleştirme ve Sınama” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Swift Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Swift Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Durum, Eylem ve Reducer
- Store ve SwiftUI Entegrasyonu
- Efektler ve Bağımlılıklar
- Özellikleri Birleştirme ve Sınama