2013-03-03 25 views
5

Tôi có đầu ra sau đây từ một thử nghiệm Google Test đơn vị:Tùy chỉnh thực tế/dự kiến ​​"Giá trị của" chuỗi trong Google thử nghiệm thông điệp đầu ra thất bại

UnitTests.cc:56: Failure 
Value of: LineSegment2i(Vector2i(-10,0), Vector2i(-10,10)).toLine() 
    Actual: 24-byte object <00-00 00-00 00-00 24-C0 00-00 00-00 00-00 00-00 00-00 2F-2B FF-7F 00-00> 
Expected: Line(10, 3.14159265358979323846) 
Which is: 24-byte object <00-00 00-00 00-00 24-40 18-2D 44-54 FB-21 09-40 00-00 64-00 00-00 00-00> 
[ FAILED ] LineSegmentTests.toLine (1 ms) 

Đó là chuỗi đầu ra hệ thập lục phân không phải là rất hữu ích. Có điều gì tôi có thể thêm vào lớp Line (mà một bài kiểm tra bình đẳng không thành công) để cung cấp các lỗi hữu ích hơn trong các trường hợp như vậy không?

Lớp trong câu hỏi đã ghi đè các nhà điều hành << như một hàm thành viên:

std::ostream& operator<<(std::ostream& stream) const 
{ 
    return stream << "Line (radius=" << d_radius << " theta=" << d_theta << ")"; 
} 

Bạn có thể thấy rằng công trình này cho dòng 'dự kiến', nhưng không phải là dòng 'thực tế'. Tuyên bố này là không đúng — kiểm tra được hiển thị đến từ tham số của macro TEST.

Trả lời

6

Để in các loại tùy chỉnh, bạn có thể "dạy" Google thử nghiệm làm thế nào để in các loại tùy chỉnh của bạn mà như mô tả trong phần "Dạy Google Test Làm thế nào để in các giá trị của bạn" here

7

Phần header trong file nguồn gtest-printers.h cung cấp một câu trả lời:

Tập tin này thực hiện một máy in giá trị phổ quát có thể in một giá trị bất kỳ loại T:

trống :: thử nghiệm :: nội bộ: : UniversalPrinter :: In (giá trị, ostream_ptr);

Người dùng có thể dạy chức năng này cách in loại T bằng cách xác định toán tử < <() hoặc PrintTo() trong không gian tên xác định T. Cụ thể hơn, hàm được xác định đầu tiên trong danh sách sau sẽ được sử dụng (giả sử T được định nghĩa trong namespace foo):

  1. foo :: printto (const T &, ostream *)
  2. hành < < (ostream &, const T &) quy định tại một trong hai foo hoặc không gian tên toàn cầu .

Nếu không có điều nào ở trên được xác định, nó sẽ in chuỗi gỡ lỗi của giá trị nếu đó là bộ đệm giao thức hoặc in byte thô theo giá trị khác.

Vì vậy, có vẻ như toán tử ghi đè cần phải là chức năng không phải là thành viên.

std::ostream& operator<<(std::ostream& stream, Line const& line) 
{ 
    return stream << "Line (radius=" << line.radius() << " theta=" << line.theta() << ")"; 
} 
Các vấn đề liên quan