Tại sao các thuộc tính kiểm thử đơn vị thường yêu cầu Phương thức công khai?


12

Gần đây tôi đã lưu ý rằng việc thêm [TestInitialize] vào một phương thức được bảo vệ trong một cụm .NET không được tôn trọng, nhưng nếu tôi công khai phương thức đó thì nó được gọi bởi người chạy thử nghiệm đơn vị (Resharper trong trường hợp này). Tôi đã nhận thấy điều này nhiều lần trong quá khứ với các phương pháp thử nghiệm.

Về mặt kỹ thuật, nó dễ dàng phản ánh một phương pháp riêng tư như một phương thức công khai. Như một vấn đề thực tế, sự phản chiếu là một phương pháp được sử dụng để kiểm tra các phương thức riêng tư.

Vậy tại sao tôi cần phải công khai tất cả các phương pháp kiểm tra đơn vị của mình?


2
Đó là một câu hỏi thực sự tốt. Lập luận tốt duy nhất tôi từng nghe là nó tuân theo nguyên tắc "lập trình cho một giao diện, không phải để thực hiện", một phần của các nguyên tắc RẮN.
Robert Harvey

9
Tôi không nghĩ rằng anh ấy đang nói về việc kiểm tra các lớp học của mình, anh ấy đang nói về các phương pháp kiểm tra thực tế được gọi bởi khung kiểm tra.
jtiger

1
@RobertHarvey trong Java, lý do cho sự hạn chế tương tự (ví dụ trong JUnit) là các nhà thiết kế khung không muốn gây rối với setAccessiblemột số SecurityManager tùy chỉnh
gnat

1
bạn cần lưu ý rằng quyết định thiết kế này được đưa ra cho khung mục đích chung được nhắm mục tiêu sử dụng rộng rãi. Trong trường hợp như vậy, sẽ an toàn hơn cho nhà thiết kế giả định và chuẩn bị cho điều tồi tệ nhất. Nếu đó là, tôi không biết, một số khung nội bộ công ty (nơi người ta có thể có cơ hội đảm bảo các chính sách bảo mật mong muốn) hoặc nếu đó là một công cụ có mục đích chuyên biệt, hẹp (nghĩ "người xem cho các thành viên không thể truy cập"), nhà thiết kế sẽ có các lựa chọn khác để xem xét
gnat

2
@GregBurghardt Hành vi này được tìm thấy trong Nunit và có lẽ các khung kiểm tra khác mà Microsoft đã không viết. Chắc chắn trong những năm kể từ khi hỏi câu hỏi này, tôi hiểu nhiều hơn về .NET, nhưng tôi vẫn nghĩ đó là một câu hỏi công bằng, và có một số thảo luận tốt trong các bình luận.
Justin thân mến

Câu trả lời:


2

Bạn nên kiểm tra những gì lớp học làm , không phải nó làm như thế nào .

Theo như "Thế giới bên ngoài" có liên quan, đó là bất cứ điều gì mà lớp học đưa ra Công khai; Khung kiểm tra của bạn đang đưa ra giả định tương tự.

Bằng cách kiểm tra bất cứ điều gì "ít" hơn Công khai, bạn đang đi sâu vào triển khai nội bộ của lớp, đó là một Ý tưởng tồi.


Lưu ý rằng câu hỏi là về các phương pháp thử nghiệm, chứ không phải các phương pháp trong hệ thống được thử nghiệm. Mặc dù đúng là OP lập luận rằng bạn có thể sử dụng sự phản chiếu để kiểm tra những thứ "ít" hơn công khai, nhưng đó là một lập luận về khả năng của các khung kiểm tra để truy cập các phương thức riêng tư. Khung thử nghiệm phải sử dụng sự phản chiếu để tìm các phương thức thử nghiệm (được đánh dấu bởi một thuộc tính) và do đó phải sử dụng sự phản chiếu, với ý nghĩ đó ... "tại sao tôi cần phải công khai tất cả các phương thức thử nghiệm đơn vị của mình?"
Theraot

Phương pháp thử nghiệm có khả năng truy cập các phương thức riêng tư; với Reflection, bất cứ điều gì cũng có thể. Tôi thấy câu hỏi này nhiều hơn về [un] mong muốn làm như vậy.
Phill W.

0

Theo nguyên tắc chung, tốt nhất là chỉ truy cập các phương thức công khai - khi bạn tạo một lớp, bạn cũng đang tạo hợp đồng về việc các lớp khác sẽ truy cập vào mã của bạn. Vì vậy, câu trả lời rất có thể chỉ vì đó là một quy ước.


1
Điều này không thực sự trả lời câu hỏi.
RubberDuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.