2012-02-23 19 views
5

Tôi đã viết một số bài kiểm tra đơn vị cơ sở dữ liệu tSQLt (qua Red Gate SQL Test) về các thủ tục gọi các cột có chứa (đã tồn tại) được tính toán gần đây và lưu ý rằng nếu tôi sử dụng FakeTable SP, Tôi thấy rằng các cột được tính toán không được điền (chúng được đánh giá là rỗng). Cột được tính toán là chìa khóa để thử nghiệm, vì vậy tôi không thể bỏ qua cột trong thử nghiệm và tôi không muốn sao chép logic.Kiểm thử đơn vị với tSQLt trên các cột được tính toán

Tôi đang đánh giá kết quả bằng cách sử dụng tSQLt.AssertEqualsTable SP và vì vậy tôi muốn đảm bảo các giá trị cột giống nhau trong cả hai. Trong thực tế, tôi đã giải quyết vấn đề này bằng cách không sử dụng FakeTable, nhưng bằng cách sử dụng câu lệnh giao dịch rollback (một phần) ở cuối bài kiểm tra (mỗi bài đăng trên blog ở số http://sqlity.net/en/585/how-to-rollback-in-procedures/) hoặc xóa các giá trị thử nghiệm một cách rõ ràng.

Tôi chắc chắn phải có cách tốt hơn để mã hóa kiểm tra này và sẽ hoan nghênh mọi đề xuất.

Trả lời

4

Bạn nên tách logic trong cột được tính từ logic trong quy trình khi thử nghiệm. Thủ tục sẽ lấy thông tin trong cột đó và hành động trên đó. Quy trình không nên quan tâm đến cột là cột được tính toán hoặc cột thực. Điều đó có nghĩa là, trong thử nghiệm của bạn, bạn có thể mã hóa một giá trị để đặt vào cột đó. FakeTable làm cho điều đó có thể bằng cách biến bất kỳ cột được tính toán thành một cột thực.

Trong một bộ kiểm tra khác, bạn có thể (và nên) kiểm tra rằng cột được tính được tính toán chính xác. Cho rằng một bổ sung cho FakeTable có sẵn. Điều này bảo tồn tài sản tính toán của bảng. Bạn cần đặt tham số @ComputedColumn của EXECUTE tSQLt.FakeTable thành 1. (http://tsqlt.org/user-guide/isolating-dependencies/faketable/)

Btw, bạn không cần khôi phục bất kỳ thứ gì trong thử nghiệm. tSQLt đang quan tâm đến điều đó. Logic được mô tả trong bài viết mà bạn đề cập chỉ cần thiết trong quy trình của riêng bạn, nếu quản lý giao dịch là yêu cầu của proc đó.

+0

Cảm ơn Sabastian, điều đó rất hữu ích. Tôi đã cố gắng kết hợp hai bài kiểm tra, nhưng khi bạn chỉ ra đây là những bài kiểm tra khác nhau. – DaveGreen

3

Hiện nay, một bản cập nhật trước khi phát hành để tSQLt sẵn trên mailing list: http://groups.google.com/group/tsqlt

Các trước khi phát hành chứa các tính năng để bảo vệ cột tính toán hoặc giá trị mặc định trong FakeTable.

Ví dụ:
EXEC tSQLt.FakeTable 'dbo.tst1', @ComputedColumns = 1;
EXEC tSQLt.FakeTable 'dbo.tst1', @Defaults = 1;

Chúng sẽ sớm sẵn sàng phát hành chính thức.

Các vấn đề liên quan