xem xét:Làm thế nào để viết một bài kiểm tra đơn vị cho "T phải là một kiểu tham chiếu"?
class MyClass<T> where T : class
{
}
Trong trường hợp đó, mệnh đề where đang thực thi một đặc điểm kỹ thuật mà MyClass chỉ là một chung của một loại tài liệu tham khảo.
Lý tưởng nhất là tôi nên có một bài kiểm tra đơn vị kiểm tra đặc điểm kỹ thuật này. Tuy nhiên, thử nghiệm đơn vị này rõ ràng sẽ không hoạt động, nhưng nó giải thích những gì tôi đang cố gắng hoàn thành:
[Test]
[DoesNotCompile()]
public void T_must_be_a_reference_type()
{
var test = new MyClass<int>();
}
Tôi có thể làm gì để kiểm tra thông số được thực hiện bằng cách không cho phép biên dịch mã?
EDIT:
Thông tin thêm: Ok, vậy lý luận của tôi để làm điều này (haha) là tôi đã làm theo một phương pháp TDD, trong đó bạn không thể viết bất kỳ mã trừ khi bạn có một kiểm tra đơn vị không thành công. Giả sử bạn có điều này:
class MyClass<T> { }
Bạn có thể viết bài kiểm tra nào thất bại trừ khi T là lớp học? Một cái gì đó như default(T) == null
?
Hơn nữa EDIT:
Vì vậy, sau một "nguyên nhân gốc rễ phân tích" về vấn đề này, vấn đề là tôi đã dựa vào default(T)
là null
trong một người tiêu dùng của lớp này, một cách tiềm ẩn. Tôi đã có thể tái cấu trúc mã người tiêu dùng đó thành một lớp khác, và chỉ định một hạn chế kiểu chung ở đó (giới hạn nó thành class
), điều đó có hiệu quả làm cho mã đó không biên dịch nếu ai đó xóa bỏ giới hạn trên lớp mà tôi đang nói ở trên.
Tại sao bạn không kiểm tra đơn vị rằng lớp được đặt tên là 'MyClass'? – SLaks
@SLaks: kỹ thuật var test = new MyClass(); sẽ kiểm tra điều đó, phải không? –
Tôi nghĩ @SLaks đã sử dụng mỉa mai để chứng minh rằng bạn không cần phải kiểm tra trình biên dịch ... đó là công việc của Microsoft. – TheCloudlessSky