2015-09-24 29 views
8

Tôi nhận thấy một số hành vi kỳ lạ trong thử nghiệm đơn vị cho C#.Kết quả khác nhau từ DateTime mới() và DateTime.Parse

Với đoạn mã sau:

var dateTime = DateTime.Parse("01/01/2015"); 
Assert.AreEqual(dateTime, new DateTime(2015, 1, 1)); 

tôi nhận được một thử nghiệm thất bại với kết quả:

Expected: 2015-01-01 00:00:00.000 
But was: 01/01/2015 00:00:00 +00:00 

Tôi đã thử gọi ToString() trên cả hai, đi qua trong CultureInfo.CurrentCulture và thiết lập DateKind trên cuộc gọi DateTime mới cho cả Local và UTC nhưng tôi nhận được cùng một loại kết quả.

Tại sao hai phương pháp này không cho kết quả tương tự?

+0

[sử dụng '==' kết quả là đúng] (http://csharppad.com/gist/ba4918946a41c49b9c4c). phải là thứ bạn không hiển thị. – Amit

+0

'CurrentCulture' của bạn là gì? –

+1

Khung kiểm thử của bạn là gì và chữ ký của 'Assert.AreEqual' là gì - nó có lấy' Object', 'DateTime',' String' hay cái gì khác không? –

Trả lời

1

tôi sẽ cung cấp cho một shot với:

Assert.IsTrue(DateTime.Compare(DateTime.Parse("01/01/2015"), new DateTime(2015, 1, 1) == 0); 
+0

Trong khi đó có thể gặp vấn đề, nó không thực sự trả lời câu hỏi: _ "Tại sao hai phương pháp này lại không cho kết quả tương tự?" _ –

+0

Bởi vì nó sử dụng AreEquals trên một datetime có thể không sử dụng bộ so sánh thích hợp, nhưng , vì tôi không chắc chắn về nó, tôi muốn nhận được phản hồi của OP để giải thích thêm –

0

Bạn nên chưa bao giờ hardcode ngày như chuỗi. Điểm làm việc đó là gì?

DateTime.Parse("01/01/2015") 

thay vì làm điều này:

new DateTime(2015,1,1) 

DateTime.Parse đang sử dụng văn hóa hiện tại của bạn theo mặc định để tạo ra một ngày. Hãy xem xét ví dụ sau:

DateTime.Parse("09/06/2015"); 

Có phải là ngày 9 tháng 6 hoặc 6 tháng 9 không? Tùy thuộc vào văn hóa máy tính của bạn, bạn sẽ nhận được kết quả khác nhau. Nếu chuỗi DateTime của bạn xuất phát từ đâu đó thì bạn có thể buộc phương thức Parse sử dụng Định dạng/Văn hóa cụ thể.

Quay lại câu hỏi có thể phụ thuộc vào văn hóa.

+4

_ "Điểm làm việc đó là gì?" _ Có lẽ bài kiểm tra đơn vị mô phỏng đầu vào của người dùng trong một hộp văn bản? –

+0

Đọc câu tiếp theo – MistyK

+0

@JamesThorpe - nhấn vào. Trong thực tế, nó kéo các giá trị từ một bảng cơ sở dữ liệu, nhưng đối với một bài kiểm tra đơn vị tôi mô phỏng bit đó bởi vì các bài kiểm tra đơn vị. –

0

Câu hỏi giả định trong ví dụ đơn giản rằng biến đầu tiên là một DateTime, khi nó thực sự là một DateTimeOffset. Các phương thức công khai được tiêu thụ mà biến được tạo ra đã thay đổi và tôi cho là không đúng kiểu trả về vẫn là một DateTime.

Vì vậy, lý do chúng cho kết quả khác nhau là vì chúng khác nhau!

Bài học Một: Kiểm tra các loại ngay cả khi bạn biết chúng là gì. Bài học hai: Không đơn giản hóa quá nhiều trong các ví dụ về câu hỏi SO.

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