2010-04-11 25 views
5

(Giả sử rằng tôi có lý do chính đáng không để loại bỏ NSAssert của tôi() kiểm tra trong mã của tôi chỉ vì tôi cũng đang làm thử nghiệm đơn vị.)Làm thế nào tôi có thể kiểm tra cho NSAssert nhấn các trường hợp sử dụng khuôn khổ đơn vị kiểm tra iPhone của

Trong mã thử nghiệm đơn vị của tôi, tôi muốn chắc chắn rằng một NSAssert trong mã số của tôi (khẳng định) khi tôi gọi nó. Do đó, tôi sử dụng macro STAssertThrows() khi gọi mã xác nhận.

Vấn đề là: Mặc dù tài liệu nói rằng NSAssert sẽ ném một ngoại lệ, chạy thử nghiệm đơn vị sẽ dừng lại với một thông báo lỗi cho biết ứng dụng bị lỗi.

Đây là với SDK 3.1.3 trong Trình mô phỏng.

Đây có phải là lỗi trong khung hoặc có điều gì đó tôi có thể thực hiện để làm cho công việc này tốt hơn, tức là NSAssert ném ngoại lệ thích hợp mà macro thử nghiệm đơn vị có thể bắt được không?

Trả lời

1

Tôi bắn quá nhanh.

Hóa ra rằng vấn đề là ở một nơi khác:

Lớp mà chứa NSAssert rằng sa thải không phải là một lớp con của NSOject. Điều này là OK cho đến bây giờ bởi vì nó chỉ chứa các phương thức lớp, không có phương thức cá thể nào. Nhưng khi NSAssert truy cập, nó muốn lấy tên lớp của mã mà nó đang ngồi và phương thức đó bị thiếu. Làm cho lớp này trở thành lớp con của NSObject đã sửa nó, và bây giờ NSAssert thực sự ném một ngoại lệ có thể được kiểm tra bởi STAssertThrows.

Tôi đã tìm thấy điều này bằng cách xem các cảnh báo trong nhật ký kiểm tra đơn vị ngay trước khi xảy ra sự cố: Cảnh báo không thể tìm thấy phương thứcSignatureForSelector và doesNotRecognizeSelector. Sau khi thêm chúng và in ra bộ chọn mà họ đang tìm kiếm (NSLog(@"sel:%s", aSelector);), tôi thấy rằng nó đang tìm kiếm phương thức "lớp". Rồi tôi nhận ra chuyện gì đang xảy ra.

Vì vậy, trong khi đây là một câu hỏi tranh luận, tôi hy vọng rằng ít nhất giải thích này đang giúp một người nào đó một ngày nào đó, có lẽ :)

Tôi không nhớ có q này đã bị xóa, tuy nhiên, một trong hai.

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