Shape guard
Container dùng chung nghĩa là schema dùng chung. Một test xóa hoặc đổi kiểu một table sẽ khiến test kế tiếp fail vì lý do sai, và lỗi chỉ vào nạn nhân chứ không phải thủ phạm.
Shape guard (bộ canh hình dạng schema) sửa việc đổ lỗi này.
Cách hoạt động
Phần tiêu đề “Cách hoạt động”Guard chụp snapshot mọi table, view và routine sau khi schema được áp dụng. DbTestBase đọc lại chúng sau mỗi test, và làm fail test đã thay đổi một object.
Assert.Fail failed. The test left a shared database object reshaped. Restore it before thetest ends (the shape guard compares against the schema as applied):[ShapeGuard] CustomerTests.Adds_A_Column left dbo.customers columns changed (id,email) -> (id,email,probe)Việc kiểm tra chạy sau test, và sau mọi [TestCleanup] của class kế thừa bạn viết, nên test tự dọn dẹp sau khi chạy vẫn pass.
Những gì nó phát hiện
Phần tiêu đề “Những gì nó phát hiện”Với mỗi object trong snapshot, guard báo một trong các thay đổi:
| Thay đổi | Thông báo |
|---|---|
| Object đã biến mất | dropped |
| Loại object đổi, ví dụ table trở thành view | re-typed (Table -> View) |
| Các cột đổi, về tên hoặc thứ tự | columns changed (before) -> (after) |
Object do test tự tạo không được theo dõi, chỉ theo dõi schema như lúc đã áp dụng.
Ai bị đổ lỗi
Phần tiêu đề “Ai bị đổ lỗi”Thủ phạm chỉ bị đổ lỗi một lần. Các test sau nó không bị, vì chúng chỉ thừa hưởng hậu quả.
Một object đã được trả về như cũ sẽ bị quên, nên test tiếp theo làm hỏng nó sẽ lại bị đổ lỗi.
Nó phát hiện, không sửa chữa
Phần tiêu đề “Nó phát hiện, không sửa chữa”Việc tự sửa âm thầm sẽ che mất sự rò rỉ ở lần chạy sau, mà lần chạy sau lại đúng là lúc bạn muốn thấy nó. Guard nêu tên object và test, còn việc sửa là của bạn.
Nếu chỉ muốn ghi log sự rò rỉ, override FailOnShapeLeak. Khi đó báo cáo được ghi vào test output và test vẫn pass:
protected override bool FailOnShapeLeak => false;Không dùng base class
Phần tiêu đề “Không dùng base class”Tự gọi việc kiểm tra trên một harness:
var leaks = await harness.CheckShapeAsync("CustomerTests.Adds_A_Column");Nó trả về các leak lần đầu được phát hiện bởi lần kiểm tra này, và một danh sách rỗng khi schema còn nguyên vẹn. Harness cũng cung cấp chính guard qua harness.Guard.
Tiếp theo
Phần tiêu đề “Tiếp theo”- Dọn dữ liệu: làm trống dữ liệu, không đụng đến hình dạng.
- Xử lý sự cố.