Có cách nào để viết một cái gì đó như một "bài kiểm tra đơn vị" mà chắc chắn rằng một số mã không không phải là biên dịch?Làm thế nào để viết một bài kiểm tra đơn vị scala để đảm bảo sự thất bại?
Tại sao tôi lại muốn một thứ như vậy? Hai lý do.
1) Kiểm tra loại an toàn của API của tôi. Tôi muốn một cách để đảm bảo rằng nếu ai đó vượt qua trong một giá trị xấu, bạn nhận được một lỗi trình biên dịch, không chỉ là một lỗi thời gian chạy. Rõ ràng, tôi chỉ có thể chạy trình biên dịch và kiểm tra lỗi, nhưng có nó được chính thức hóa trong một bài kiểm tra đơn vị là tốt để tránh một hồi quy & cũng cho tài liệu.
Ví dụ: xem xét thử nghiệm này. Có một số nhận xét ra mã mà tôi đã sử dụng để kiểm tra loại an toàn: https://github.com/squito/boxwood/blob/master/core/src/test/scala/com/quantifind/boxwood/EnumUnionTest.scala#L42 (dòng 42 & 48 - trên đường dây 34 Tôi gọi một API khác nhau trong đó có một ngoại lệ thời gian chạy, mà tôi có thể kiểm tra)
Nó thực sự đã cho tôi một thời gian để có được quyền an toàn loại, vì vậy đó là những kiểm tra quan trọng. Bây giờ nếu tôi đi và sửa đổi việc thực hiện bên dưới, tôi không thể chạy bộ thử nghiệm của mình - tôi cũng phải nhớ bỏ ghi chú những dòng đó và kiểm tra lỗi trình biên dịch.
2) Kiểm tra xử lý lỗi của macro. Nếu một macro có một số đầu vào xấu, nó sẽ dẫn đến lỗi trình biên dịch. Cùng một vấn đề ở đây, cùng mong muốn có nó trong một bộ thử nghiệm dễ chạy.
Tôi sử dụng ScalaTest, nhưng tôi rất vui khi có giải pháp với bất kỳ khung kiểm thử đơn vị nào.
Các giải pháp rõ ràng cho rằng là để viết một bài kiểm tra đơn vị đó chạy trình biên dịch trên tài nguyên đó được quy định trong đó đơn vị kiểm tra và phân tích đầu ra của biên dịch. Xem nó theo cách này mã nguồn không phải là bản thân kiểm tra đơn vị, mà chỉ là một tài nguyên để chạy thử nghiệm đơn vị. – SpaceTrucker
có thể trùng lặp của [Kiểm tra xác nhận rằng một cái gì đó không được biên dịch] (http://stackoverflow.com/questions/15125457/testing-an-assertion-that-something-must-not-compile) –
Xem [câu hỏi trước của tôi] (http://stackoverflow.com/q/15125457/334519), [Câu trả lời của Miles Sabin] (http://stackoverflow.com/a/15132961/334519) và macro ['illTyped' mới trong Shapeless 2.0] (https://github.com/milessabin/shapeless/blob/49ef0311cadb648653c3749ae057127fe1f265d6/core/src/main/scala/shapeless/test/typechecking.scala). –