Bỏ qua để đến nội dung

Cross-domain Testing

Chương trước, chúng ta đã học cách test bằng system-wide testing — mock ở tầng thấp nhất (network), để cả hệ thống chạy thật. Chương này mở rộng thêm: test sự phối hợp giữa nhiều domain.

Trong kiến trúc app, domain là một vùng logic nghiệp vụ riêng biệt. Ví dụ:

  • Course domain: Xử lý khóa học, bài tập.
  • Payment domain: Thanh toán, subscription.
  • Authentication domain: Đăng nhập, session.

Mỗi domain có API, model, và logic riêng. Cross-domain testing kiểm tra chúng hoạt động đúng khi kết hợp với nhau.

Không phải domain nào cũng nên mock:

  • Stable domain: Ít thay đổi, behavior ổn định → Dùng thật trong test.
  • Volatile domain: Hay thay đổi, phụ thuộc external service → Mock khi cần.

Ví dụ:

  • Authentication (đăng nhập rồi lấy token) — khá stable → dùng thật.
  • Payment (kết nối payment gateway ngoài) — volatile → mock.

CourseAPI cần user token từ AuthService để gọi API:

func testLoadCourseWithAuth() async {
// Dùng AuthService thật (stable domain)
let stubbedNetwork = StubbedNetwork(responses: [
"/auth/login": loginSuccessJSON,
"/courses/123": courseJSON
])
let api = API(network: stubbedNetwork)
let authService = AuthService(api: api) // Thật
let courseAPI = CourseAPI(api: api, auth: authService) // Thật
// Login trước
try await authService.login(email: "[email protected]", password: "123")
// Load course — sử dụng token thật từ AuthService
let course = try await courseAPI.loadCourse(id: "123")
XCTAssertEqual(course.tutor.name, "Caleb Davis")
}

Lợi ích:

  • Test kiểm tra cả flow login → load course.
  • Nếu AuthService thay đổi cách truyền token, test sẽ phát hiện lỗi ngay.
Tình huống Nên mock?
Domain ổn định, ít thay đổi ❌ Dùng thật
Domain phụ thuộc external service ✅ Mock
Domain rất chậm (heavy computation) ✅ Mock
Domain có side-effect (gửi email, thanh toán) ✅ Mock

Nguyên tắc: Mặc định dùng thật, chỉ mock khi có lý do cụ thể.

  • Test riêng: Mỗi domain pass test riêng → Nhưng khi kết hợp thì lỗi.
  • Cross-domain test: Phát hiện lỗi ở điểm giao giữa các domain.

Kết luận: Cross-domain testing mở rộng system-wide test lên cấp domain. Dùng domain thật khi nó stable, mock khi nó volatile. Phát hiện lỗi integration sớm thay vì chờ lên production.