Đăng nhập bằng Apple trong TCA — Phần 3
Tóm tắt và phương pháp thử nghiệm
Hiện chúng tôi đã xây dựng ứng dụng nhỏ thú vị này cho phép chúng tôi đăng nhập bằng Apple.
Tuy nhiên, bạn có thể cảm thấy như chúng tôi đã đi đường vòng một chút để khiến mọi thứ hoạt động với TCA. Chúng tôi chắc chắn có thể đạt được điều tương tự với ít mã hơn trong vanilla SwiftUI.
Chúng tôi cũng đã tạo một số loại tùy chỉnh (chẳng hạn như AppleAuthenticationResponseloại) để mang thông tin mà các loại nội bộ khác mang theo từ AuthenticationServiceskhung.
Vậy tại sao chúng ta lại gặp rắc rối khi trừu tượng hóa mọi thứ với TCA?
Chà, với TCA, chúng tôi có khả năng dễ dàng viết các bài kiểm tra cho bất kỳ logic nào thực tế mà chúng tôi đã xác định trong ứng dụng của mình. Khi chúng tôi đang sử dụng các loại tùy chỉnh, chúng tôi sẽ dễ dàng giả định các tương tác với các phụ thuộc. Chúng tôi cũng sẽ không phải lo lắng về quan điểm của mình, vì logic đó gần như hoàn toàn tách rời khỏi giao diện người dùng.
Phương pháp thử nghiệm
Trong các bài kiểm tra đơn vị iOS thông thường, chúng tôi sẽ xác nhận các thay đổi bằng cách sử dụng XCTAssert. Để kiểm tra mã TCA, chúng tôi sẽ phải sử dụng TestStore, một đối tượng có thể giúp chúng tôi mô phỏng hành vi trong các tính năng TCA của chúng tôi.
Chúng tôi sẽ sử dụng send()chức năng này để kích hoạt các hành động mà chúng tôi chọn và
chức receive()năng xác minh các hành động TCA khác đã được nhận, cũng như xác minh mọi thay đổi xảy ra với trạng thái của ứng dụng.
Cửa hàng kiểm tra gốc
Trong tất cả các bài kiểm tra mà chúng tôi sẽ viết, chúng tôi sẽ sử dụng trạng thái Gốc /bộ giảm tốc, vì đây là tính năng quản lý các thay đổi trạng thái cấp ứng dụng.
let store = TestStore(
initialState: Root.State(),
reducer: Root()
)
Nếu chúng tôi chia ứng dụng của mình thành các sự kiện kích hoạt các thay đổi trong trạng thái của ứng dụng (ví dụ: hành vi), thì có ba sự kiện như vậy sẽ xuất hiện trong tâm trí chúng tôi;
- Đăng nhập thành công với Apple qua nút SIWA
- Đăng xuất khỏi ứng dụng thông qua nút “Đăng xuất”
- Kiểm tra trạng thái xác thực của người dùng khi khởi chạy
Kiểm tra đăng nhập thành công
Vì giao diện người dùng của chúng tôi được điều khiển bởi trạng thái nên chúng tôi có thể kiểm tra đăng nhập thành công bằng cách xác minh rằng trạng thái của ứng dụng thay đổi thành trạng thái Chính sau khi nhấn nút SIWA.
Kích hoạt sự kiện
- Đầu tiên, chúng ta có thể tạo một bản mô phỏng
AppleAuthenticationResponse(như một bản mô phỏng được tạo khi người dùng đăng nhập). - Sau đó, để sao chép những gì xảy ra với một lần đăng nhập thành công, chúng tôi có thể sử dụng
store.send()để gửi.signInWithAppleButtonTappedhành động bằng phản hồi giả của mình.
- Cửa hàng sẽ nhận được sau đó
.didSignInủy quyền hành động từ tính năng Đăng nhập . Chúng tôi có thể xác minh rằng bằng cách sử dụng tệpstore.receive(). - Sau đó, trạng thái của ứng dụng sẽ thay đổi thành
.main(Main.State()). Chúng tôi có thể xác minh điều này trong phần đóng được chuyển vàostore.receive()cuộc gọi.
$0 = .main(Main.State())
Kích hoạt sự kiện
- Để sao chép những gì xảy ra sau khi đăng xuất xảy ra, chúng tôi có thể gửi
.signOutButtonTappedhành động.
- Sau đó, cửa hàng sẽ nhận được
.didSignOuthành động của đại biểu. - Sau đó, trạng thái của ứng dụng sẽ thay đổi thành
.signIn(SignIn.State()).
Các bài kiểm tra chúng tôi viết để xác minh hoạt động kiểm tra xác thực của chúng tôi sẽ khác một chút so với các bài kiểm tra chúng tôi đã viết, vì kiểm tra xác thực phụ thuộc vào sự AuthenticationClientphụ thuộc.
Điều này có nghĩa là chúng tôi sẽ cần sử dụng unimplementedphiên bản AuthenticationClient(mà chúng tôi đã thiết lập trong phần 1 của bài viết), phiên bản này sẽ cho phép chúng tôi mô phỏng các phản hồi từ khách hàng.
Sau khi thiết lập mô hình giả, chúng tôi sẽ ghi đè trực tiếp TestStore authenticationClientvới unimplementedứng dụng khách của mình thông qua thuộc dependenciestính.
var authenticationClient = AuthenticationClient.unimplemented
authenticationClient.checkAppleAuthenticationStatus = { _ in
.signedIn
}
store.dependencies.authenticationClient = authenticationClient
Để kiểm tra cách ứng dụng hoạt động khi người dùng đã đăng nhập khi khởi chạy, chúng ta có thể mô phỏng một .signedIntrạng thái được trả về từ quá trình kiểm tra xác thực.
Kích hoạt sự kiện
- Đầu tiên, chúng tôi sẽ cần chuyển
.signedIntrạng thái vào thuộccheckAppleAuthenticationStatustính củaunimplementedkhách hàng của chúng tôi. - Sau đó, chúng tôi có thể gửi
._onAppearhành động, vì thao tác đó sẽ bắt đầu quá trình kiểm tra xác thực (như chúng tôi đã thiết lập trong phần 2 của bài viết).
- Sau đó, cửa hàng sẽ nhận được
._checkAuthenticationStatusResponsehành động với.signedIntrạng thái mà chúng tôi đã chuyển chounimplementedkhách hàng. - Sau đó, trạng thái của ứng dụng sẽ thay đổi thành
.main(Main.State()).
Để kiểm tra kịch bản mà người dùng đã đăng xuất khi khởi chạy, chúng tôi gần như có thể sử dụng lại bài kiểm tra mà chúng tôi vừa viết, chỉ với một vài thay đổi nhỏ.
Kích hoạt sự kiện
- Lần này, chúng tôi chuyển
.signedOuttrạng thái vàocheckAppleAuthenticationStatustài sản. - Sau đó, chúng tôi có thể gửi lại
._onAppearhành động để bắt đầu kiểm tra xác thực.
- Sau đó, cửa hàng sẽ nhận được
._checkAuthenticationStatusResponsehành động với.signedOuttrạng thái lần này. - Và sẽ không có thay đổi về trạng thái, vì trạng thái mặc định khi khởi chạy là trạng thái Đăng nhập — vì vậy sẽ không có thay đổi nào được phát hiện (ngay cả khi trạng thái Đăng nhập được chỉ định).
Cùng với đó — chúng tôi đã đề cập đến cách thiết lập, giao diện người dùng và phương pháp thử nghiệm để triển khai Đăng nhập bằng Apple bằng TCA. Nếu bạn thấy bài viết này hữu ích hoặc hữu ích chút nào, vui lòng liên hệ trên Twitter hoặc Mastodon. Chúc bạn ngày mới tốt lành!

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































