Bằng mọi cách có thể, Tổng Thống Wallace rót tiền vào dự án Nimbus. Ông chỉ đạo hội nghiên cứu phát triển công nghệ với mục đích: một là cứu nhân loại thoát khỏi Clyde; hai là bảo vệ công sức của ông trước sức mạnh của phe Trục.
Phần đằng sau nhận được thành công chốc lát hơn là phần trước. Công nghệ cho các hệ thống vũ khí được chế tạo và đem vào sử dụng trong thời gian ngắn đến kinh ngạc. Một câu trích dẫn nổi tiếng của Edward Teller tóm tắt thời ký đó: “Khi bạn chiến đấu vì một mục đích tuyệt vọng và có lý do tốt để chiến đấu, bạn thường thắng.”
Đến tháng Tám năm 1943, tên lửa của Von Braunn phóng máy quay vào quỹ đạo để do thám châu Âu và châu Á. Các khay phim được đẩy ra khỏi vệ tinh và thu thập bởi máy bay trong lúc chúng đang rơi xuống bằng dù.
Đó là cách nước Mỹ biết phe Trục đang âm mưu xâm chiếm Mexico.
Khi tôi trở về từ phòng vệ sinh, Jasper vẫn đang ngồi ở bàn làm việc đợi tôi. Nụ cười của hắn được thay thế bởi sự nhăn nhó đầy xấu hổ.
“Alphonse, nghe này.” Hắn nói với cái giọng “đáng yêu”. “Tao xin lỗi; Tao đoán là đang cố hơi quá. Sự thật là tao mới đạt được danh hiệu Du mục, và tao chưa từng có học viên. Chúng ta bắt đầu lại từ đầu được không?”
Tôi cũng đang suýt xin lỗi, nên tôi rất mừng vì hắn làm trước. “Chắc chắn rồi, Jasper, chúng ta có thể bắt đầu lại. Chỉ cần đỡ đỡ cái thái độ một chút, được không?”
“Tao sẽ cố, Alphonse. Và nếu tao quên, đừng chần chứ cứ bảo. Được chứ?”
“Được.” Tôi không chắc nó sẽ kéo dài, nhưng chúng tôi có nhiều việc phải làm, và chúng tôi không cần vấn đề cá nhân chen vào. “Vậy ta đang đến đâu rồi?”
Jasper quay mặt về màn hình và nói: “Chúng ta mới cho bài kiểm thử SuitRegistrationRejectedByManufacturing chạy được. Vậy bài kiểm thử tiếp theo ta nên làm là về từ chối bộ đồ đã có sẵn.”
“Ý mày là nếu có ai cố đăng ký bộ đồ đã được đăng ký rồi, ta nên từ chối nó? Nghe có lý đấy.”
“Được rồi. Để tao cho mày xem phần fixture mới mà Rick Mugridge viết. Nó được gọi là DoFixture, và nó rất có ích khi viết mấy bài kiểm thử như này.”
“Rick nào cơ?”
“Rick Mugridge. Ông ấy được đào tạo về lái tàu, nhưng đam mêm lập trình. Vậy giờ bắt đầu với việc tạo trang kiểm thử mới.”
Jasper mở trang RegisterSuit và thay đổi như sau:
Rồi hắn ấn vào đường dẫn RejectDuplicateRegistration và dán phần sau vào trang mới:
Tôi chỉ vào dòng đầu trên màn hình và nói: “Cả ba trang kiểm thử của ta đều có dòng !path kia. Có cách nào để cho nó vào một chỗ không?”
Jasper nháy mắt và nói: “Chắc chắn lun, Fon… Alphonse. Chúng ta có thể chuyển nó về trang mẹ.” Và hắn thay đổi trang RegisterSuit, và chuyển dòng !path khỏi ba trang phụ.
Và Jasper gõ bảng sau vào trang RejectDuplicateRegistration:
“Được rồi, có vẻ khác.” Tôi nói. “Để xem tao có hiểu không. Đầu tiên là đưa bộ đồ 314159 vào trong cơ sở dữ liệu đăng ký. Tiếp theo là đăng ký bộ 314159, và muốn nó thất bại vì nó bị lặp. Mày đảm bảo rằng sẽ không có tin nhắn được gửi sang bên sản xuất, số bộ đồ trong cơ sở dữ liệu vẫn là một, và một tin nhắn lỗi phù hợp được tạo ra.”
Nụ cười của Jasper quay trở lại. “Chuẩn rồi bạn già Alphosne!”
Có lẽ Jasper không bỏ thái độ đi được. Tôi lờ nó đi và hỏi: “Cái này khá dễ hiểu, nhưng dòng start trên đầu là gì kia?”
Jasper nhướn mày hai lần và nói: “Để ý tốt lắm! Đó là tên lớp, DTrackFixture, nó chứa tất cả phương thức mà phần fixture này sẽ gọi đến.”
Tôi không hiểu phần này và có lẽ trông hơi bối rối vì Jasper nói: “Để tao chỉ cho. Ấn vào nút kiểm tra đi.” Tôi nghe theo và thấy:
“Đúng rồi.” Jasper nói. “Phải import gói fitlibrary.”
Và tôi thêm fitlibrary vào bảng Import như sau:
Giờ khi tôi ấn nút kiểm tra tôi nhận được một đống tin nhắn báo lỗi. Cái đầu tiên là:
Trước khi Jasper kịp nói tôi bảo: “Được rồi, giờ tao phải tạo lớp tên là dtrack.fixtures.DtrackFixture phải không?”
“Chuẩn không cần chỉnh, Al! À, Alphonse.”
Rõ ràng là hắn đang cố gắng. Tôi ngạc nhiên là nó lại khó như thế, nhưng tôi không nói gì. Tôi chỉ gõ:
Nó làm cho lỗi đầu tiên biến mất. Cái tiếp theo là:
Lại một lần nữa, trước khi Jasper kịp nói, tôi bảo: “Được rồi, đây chắc là phương thức của DtrackFixture, phải không?” Tôi có thể thấy hắn chuẩn bị lên dây cót để cho một tràng trả lời nên tôi giơ tay lên và ném cho hắn một cái nhìn ẩn ý. Hắn dừng lại, trông bối rối; rồi nở một nụ cười chế nhạo và nói: “Được rồi.” “Tiếp tục!” tôi tự nghĩ. Tôi gõ vào phương thức:
Nó làm cho thông báo lỗi biến mất. Tương tự, tôi làm cho tất cả cả các lỗi khác lần lượt biến mất. Cuối cùng thì fixture trông như này:
Giờ khi tôi ấn nút kiểm thử, không còn thông báo lỗi nữa. Thay vào đó, tôi có vài ô đỏ trong bảng trông như này:
Do Fixture | |||
start | start dtrack.fixtures.DTrackFixture | ||
đặt đồ | 314159 | đã đăng ký | |
kiểm tra | đồ đăng ký | 314159 | muốn trả về false |
trả về true | |||
kiểm tra | có tin nhắn sang sản xuất | muốn trả về false | |
trả về true | |||
kiểm tra | số lượng đồ đã đăng ký | muốn trả về 1 | |
trả về 0 | |||
kiểm tra | thông báo lỗi | Bộ 314159 đã được đăng ký | muốn trả về true |
trả về false |
Jasper nhìn màn hình và lắc đầu. “Mày nghĩ ra khá nhanh đấy, Alphonse. Mày nghĩ mày có thể nối fixture vào với ứng dụng?”
Không có vẻ gì là hắn đang chiếu cố khi nói thế. Tôi nghĩ hắn thực sự ấn tượng thay vì giả vờ là như vậy. “Được, tao nghĩ thế.”
Phương thức đầu tiên của fixture khá dễ. Tất cả những gì tôi cần làm là nhét bộ đồ vào trong cơ sở dữ liệu:
Rồi tôi sửa DTrackFixture.registerSuit để gọi Manufacturing.registerSuit.
Phương thức wasAMessageSentOtManufacturing kiểm tra xem có tin nhắn đã được gửi đi.
Phương thức countOfRegisteredSuitsIs cũng khá đơn giản.
Nhưng tôi không biết xử lý phương thức errorMessage. Nên tôi giữ nguyên. Khi ấn nút kiểm tra, tôi thấy:
Do Fixture | |||
start | start dtrack.fixtures.DTrackFixture | ||
đặt đồ | 314159 | đã đăng ký | |
kiểm tra | đồ đăng ký | 314159 | muốn trả về false |
trả về true | |||
kiểm tra | có tin nhắn sang sản xuất | muốn trả về false | |
trả về true | |||
kiểm tra | số lượng đồ đã đăng ký | 1 (màu xanh) | ( màu xanh) |
kiểm tra | thông báo lỗi | Bộ 314159 đã được đăng ký | muốn trả về true |
trả về false |
Tôi nhìn sang Jasper chờ. Hắn nói: “Tuyệt vời ông mặt giời, Alphonse! – À, xin lỗi, ý tao là, ừ, tốt. Nhưng còn phương thức errorMessage?”
“Tao không biết phải làm gì với phương thức này. Nó trông như kiểu mày muốn kiểm tra xem có tin nhắn lỗi được đưa ra. Nhưng tao không biết kiểm tra cái đấy.”
“CHẮC CHẮN là mày biết, Alphonse! – À, ý tao là, tao nghĩ chúng ta muốn làm một mock object đại diện cho màn hình, và ghi nhớ các tin nhắn được gửi đến. Phương thức errorMessage chỉ để xem nếu có tin nhắn lỗi nào đó được gửi ra màn hình.”
Giữa hai kiểu Jasper, tôi thích kiểu thứ hai hơn. Ý kiến của hắn có lý. Nên tôi nói: “Được rồi, vậy ta có thể tao giao diện IConsole có phương thức như kiểu display(String message). Và chúng ta có thể tạo một dummy tên Console có giao diện đó và lưu các tin nhắn được gửi đến. Nghe có vẻ dễ.” Rồi, từng bước tôi viết bài kiểm thử sau, và phần mã làm cho nó đạt:
“Được rồi, ổn đấy.” Jasper nói. “Giờ xem ta có làm cho bài kiểm thử này đạt được không.”