2009-11-22 35 views
13

Câu hỏi ngắn, tại sao Assert.AreEqual(1.0, double.NaN, 1.0) vượt qua? Trong khi Assert.AreEqual(1.0, double.NaN) không thành công.Tại sao Assert.AreEqual (1.0, double.NaN, 1.0) vượt qua?

Đây có phải là lỗi trong MSTest (Microsoft.VisualStudio.QualityTools.UnitTestFramework) hay tôi đang thiếu thứ gì đó ở đây?

Trân trọng, Egil.


Cập nhật: có lẽ nên thêm, rằng lý do đằng sau câu hỏi của tôi là, rằng tôi có một loạt các bài kiểm tra đơn vị đó không may qua do kết quả của một số hoạt động ma trận đại số tuyến tính là NaN hoặc (+/-) Vô cực. Các bài kiểm tra đơn vị là tốt, nhưng kể từ khi Assert.AreEqual trên đôi với một đồng bằng sẽ vượt qua khi thực tế hoặc/và dự kiến ​​là NaN hoặc Infinity, tôi đã được trái để tin rằng mã tôi đã thử nghiệm là chính xác.

+1

Microsoft entry lỗi: https://connect.microsoft.com/VisualStudio/feedback/details/ 762286/unit-test-with-assert-areequal-2-3-double-nan-0-1-pass – jbe

+0

Và những kẻ ngốc đóng cửa nó là "theo thiết kế". –

+0

Thú vị, vì MS đã thử lại và nói rằng nó đã được sửa: http://connect.microsoft.com/VisualStudio/feedback/details/780654/assert-equal-and-double-nan – Pat

Trả lời

9

Hãy cẩn thận. NaN là lạ, phần nào giống như null trong nhiều DBMS, và bạn không nên so sánh các giá trị với nó (hoặc trực tiếp, hoặc với Assert.AreEqual). Từ các tài liệu cho Double.NaN:

Sử dụng isNaN để xác định xem một giá trị không phải là số. Không thể xác định xem giá trị có phải là số hay không bằng cách so sánh giá trị này với một giá trị khác bằng NaN.

double zero = 0; 
Console.WriteLine((0/zero) == Double.NaN); // prints false 
Console.WriteLine(Double.IsNaN(0/zero)); // prints true 

Bạn sẽ phải ngó vào bên trong của Khẳng định (double, double, double) để xem những gì đang xảy ra, nhưng nói chung, bạn đang tùy thuộc vào không xác định hành vi liên quan đến NaN.

+0

Câu chuyện đằng sau câu hỏi của tôi là một loạt các bài kiểm tra đơn vị không may được thông qua do kết quả của một số phép toán đại số tuyến tính tuyến tính là NaN/(+/-) Infinity. Các bài kiểm tra đơn vị là tốt, nhưng kể từ khi Assert.AreEqual trên đôi với một đồng bằng sẽ vượt qua khi thực tế hoặc/và dự kiến ​​là NaN hoặc Infinity, tôi đã được trái để tin rằng mã của tôi thực sự làm việc ... –

+1

Tôi nhận được điều đó. Trên khuôn mặt của nó, hành vi là không chính xác, và bạn sẽ được hợp lý nộp một vấn đề trên Microsoft Connect. Nếu bạn thích, hãy móc lên một máy chủ biểu tượng và xem Assert.AreEqual (double, double) khác với Assert.AreEqual như thế nào (double, double, double). –

5

MSTest sử dụng công thức sau cho phương pháp Assert.AreEqual<double>(expected, actual, delta):

if (Math.Abs(expected - actual) > delta) 
    Assert.HandleFail("Assert.AreEqual", ...) 

Các hoạt động giảm để double.NaN > delta, mà trả về true trong trường hợp này. Hoặc không xác định.

6

Câu trả lời đã lỗi thời. Nếu lỗi đã được sửa, khi nào và trong phiên bản nào của assembly nào?

Đúng vậy, nó đã được sửa trong VS2013 với phiên bản Microsoft.VisualStudio.QualityTools.UnitTestFramework.dll, phiên bản 10.0.0.0. Có mặt trong phiên bản GAC cũ, c: \ windows \ assembly, nó cũng có phiên bản 10.1.0.0.

Có một câu chuyện về DLL Hell ở đây, phiên bản 10.1.0.0 là phiên bản được sử dụng trong VS2010. Nó có lỗi, không kiểm tra đúng cách cho Double.NaN. Microsoft đã mắc lỗi, họ đã sửa 10.1.0.0 nhưng không thay đổi số phiên bản. Vì vậy, bất cứ ai cài đặt VS2010 sau khi cài đặt VS2013 sẽ bị tổn thương, nó sẽ ghi đè lên DLL với phiên bản lỗi.

Làm sáng tỏ DLL Địa ngục không bao giờ đơn giản, nhưng nó xuất hiện từ connect article và từ cách nó hoạt động trên máy của tôi mà họ đã xác định chế độ lỗi từ khiếu nại của khách hàng. Và cung cấp bản sửa lỗi, được phân phối trong bản cập nhật. Không rõ ràng, sau tháng 7 năm 2014. Bây giờ bạn sẽ sử dụng v10.0.0.0, runner thử nghiệm MSTest.exe và QTAgents có tệp .config với <bindingRedirect> chuyển hướng từ 10.1.0.0 đến 10.0.0.0 (không phải lỗi đánh máy). Hãy chắc chắn để có được bản cập nhật mới nhất, hiện tại 4. Tìm trong Help + About nếu bạn không chắc chắn những gì bạn đã cài đặt bản cập nhật.

Đối với hồ sơ, mã cố định mua kiểm tra cụ thể cho Double.NaN, nó trông như thế này:

public static void AreEqual(double expected, double actual, double delta, string message, params object[] parameters) 
{ 
    if ((double.IsNaN(expected) || double.IsNaN(actual)) || double.IsNaN(delta)) 
    { 
     string str = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); 
     HandleFail("Assert.AreEqual", str, parameters); 
    } 
    if (Math.Abs((double) (expected - actual)) > delta) 
    { 
     string str2 = (string) FrameworkMessages.AreEqualDeltaFailMsg((message == null) ? string.Empty : ReplaceNulls(message), expected.ToString(CultureInfo.CurrentCulture.NumberFormat), actual.ToString(CultureInfo.CurrentCulture.NumberFormat), delta.ToString(CultureInfo.CurrentCulture.NumberFormat)); 
     HandleFail("Assert.AreEqual", str2, parameters); 
    } 
} 
+1

Cảm ơn Hans, kỹ lưỡng như mọi khi. 'Địa ngục dll' giải thích sự mâu thuẫn trong việc tái tạo lỗi này giữa các máy của đồng nghiệp của tôi. –

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