2008-09-11 21 views
7

Có thể cho SelectNodes() được gọi trên XmlDocument để trả về null không?Có thể chọn SelectNodes trên XmlDocument để trả về null không?

Tình trạng khó khăn của tôi là tôi đang cố gắng đạt 100% phạm vi kiểm tra mã đơn vị; ReSharper nói với tôi rằng tôi cần phải bảo vệ chống lại sự trả về null từ phương thức SelectNodes(), nhưng tôi không thấy cách nào XmlDocument có thể trả về null (và do đó, không có cách nào để kiểm tra mệnh đề bảo vệ của tôi và đạt 100% kiểm thử đơn vị!)

Trả lời

2

Bạn có cần đạt đến mức độ bao phủ mã 100% không? Thật vậy, thậm chí có thể trong các trường hợp bình thường (tức là có thể kiểm soát, có thể kiểm chứng) không?

Chúng ta thường thấy rằng việc sử dụng "đường cú pháp" công trình xây dựng như khối using {}, có những "ẩn" đường dẫn mã tạo (nhiều khả năng finally {} hoặc catch {} khối) mà không thể được thực hiện trừ khi một số điều kiện môi trường (như một ổ cắm bị hỏng hoặc đĩa bị hỏng) bị cản trở.

10

Nhìn vào Reflector, phương thức SelectNodes() trên lớp cơ sở của XmlDocument, XmlNode, có thể trả về null nếu cố gắng tạo một trình điều hướng trả về null. CreateNavigator() khá phức tạp và thực sự sẽ trả về null trong một vài trường hợp. Những trường hợp đó xuất hiện xung quanh một tài liệu XML không đúng định dạng - vì vậy có trường hợp kiểm tra của bạn vì lỗi SelectNodes().

+0

Sẽ không có tài liệu không đúng định dạng không phân tích cú pháp hoàn toàn? Những gì tôi thấy bên trong CreateNavigator dường như chỉ đối phó với đánh dấu hợp lệ – rpetrich

+2

Tôi nghĩ CreateNavigator() trả về 'null' nhưng chỉ cho một số loại XmlNode nhất định (không bao gồm XmlDocument). Vì vậy, theo như tôi thấy, nếu bạn đã tải một XmlDocument và nó không ném khi phân tích cú pháp, thì CreateNavigator() sẽ không bao giờ trả về 'null' và do đó SelectNodes() sẽ không bao giờ trả về' null' –

3

Nếu bạn đang gọi SelectNodes trên chính XmlDocument và nó thực sự là một XmlDocument và không phải là một lớp dẫn xuất hơn SelectNodes sẽ không trả về null.

Nếu bạn tạo một lớp con cháu và ghi đè phương thức CreateNavigator (XmlNode) thì SelectNodes có thể trả về giá trị rỗng.

Tương tự, nếu bạn gọi SelectNodes trên một EntityReference, DocumentType hoặc nút XmlDeclaration, bạn sẽ nhận được null cũng

Nói tóm lại, đối với vùng phủ sóng 100% trên một XmlDocument hoặc XmlNode bạn không chỉ tạo ra, bạn phải kiểm tra null.

+2

Đó là vấn đề: Tôi * đã làm * chỉ cần tạo ra nó, do đó tôi biết trong trái tim tôi rằng SelectNodes() không bao giờ có thể trở lại null. Mặc dù về mặt kỹ thuật nó * có thể *, giả sử, nếu một phép tái cấu trúc sau này làm cho tài liệu được truyền vào bên ngoài. Chỉ có vấn đề là bây giờ tôi không có cách nào để kiểm tra trường hợp == null trong một bài kiểm tra đơn vị. –

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