2008-12-12 38 views
6

.NET 3.5 üzerinde NUnit 2.2 kullanma, DateTime.Equals kullanırken aşağıdaki sınama başarısız olur. Niye ya?DateTime eşitliğini test ederken bu birim testi neden başarısız oluyor?

[TestFixture] 
public class AttributeValueModelTest 
{ 
    public class HasDate 
    { 
     public DateTime? DateValue 
     { 
      get 
      { 
       DateTime value; 
       return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); 
      } 
     } 

     public object ObjectValue { get; set; } 
    } 

    [Test] 
    public void TwoDates() 
    { 
     DateTime actual = DateTime.Now; 
     var date = new HasDate {ObjectValue = actual}; 
     Assert.IsTrue(date.DateValue.Value.Equals(actual)); 
    } 
} 
+0

Sadece merak, hiçbir neden ?? 2.8 son – Perpetualcoder

+0

gibi görünüyor 2.2 ile sopa çaba sarf etmiyorum. Sadece benim makinemde olduğu için 2.4 ile birlikte TestDriven.NET ile geldi. Neyi kaçırıyorum? – flipdoubt

cevap

14

tarihleri ​​eşit değildir. TryParse bazı keneler düşer. Kene değerlerini karşılaştırın.

Console.WriteLine(date.DateValue.Value.Ticks); 
Console.WriteLine(actual.Ticks); 

Verim:

633646934930000000 
633646934936763185 
+0

Bu beni biraz aldı, ama iki tarih arasında bir TimeSpan oluşturduktan sonra anladım. Senin için +1. Düşünmek ve bunu bilmek için – flipdoubt

+0

+1 size !! – Perpetualcoder

0

bu NET'te aynı olup olmadığını bilmiyorum, ama örnekleri, aynı ise değerleri aynıdır değilse Java eşittir genellikle sadece karşılaştırır. Bunun yerine compareTo 'yi kullanmak istersiniz.

+0

Hayır, Java'da, referans eşitliği için == operatörü kullanılır ve değer eşitliği için equals() yöntemi kullanılır. –

+0

@Adam: Varsayılan olarak değil. Tanımladığınız davranışı elde etmek için Object eşitlik yöntemini geçersiz kılmanız gerekir. Sovyet Rusya'da –

+0

==, Object.Equals –

0
 

public DateTime? DateValue 
     { 
      get 
      { 
       DateTime value; 
       bool isDate = DateTime.TryParse(ObjectValue.ToString(), out value); 
       return isDate ? new DateTime?(value) : new DateTime?(); 
      } 
     } 
 
+0

Kodu çalıştırmadım. Bu sadece bakışta dayanmaktadır. Üzgünüm, eğer hiç bir yardımda bulunmazsam. – shahkalpesh

+0

Üzgünüm, ama bu TryParse sorun. – flipdoubt

+0

Teşekkürler. Kod baktığımda, DateTime (TryParse başarılı olduğunda) DateTime yerine dönüyor gibi görünüyor. Burada öğrendiğim bir şey, DateTime'ın bir örneğini DateTime'a atayabilmenizdir. :) – shahkalpesh

3

Sorun gerçekten TryParse değil, ama aslında ToString()

bir test çalışmasından için.

Bir DateTime nesnesi, saniyenin milyonda bir değerine kadar doğrulukla (doğru değilse) başlar. ToString(), bir saniyeye kadar hassasiyetle bir dizeye dönüştürür.

TryParse, verilmiş olanla yapabileceği en iyisini yapıyor.

Bir biçim belirteci eklerseniz ("yyyy-MM-dd HH:mm:ss.ffffff" satırları boyunca), çalışmalıdır.

+0

Hmmm, Object.ToString() bir biçim belirteci almıyor. Baska öneri? – flipdoubt

1

Tüm hassasiyeti içeren bir format belirtmek için, String.Format() yöntemini kullanabilirsiniz. James şu şekilde görünecektir verir örnek:

String.Format("{0:yyyy-MM-dd HH:mm:ss.ffffff}", ObjectValue); 

sana bir flört değil bir şey geçirdiğinizde o ne yapacağını bilmiyorum.

Belki daha basit bir yaklaşım zaten bir tarih nesnesi varken özel bir durum eklemektir: NUnit 2.2 yapışmasını için

public DateTime? DateValue 
    { 
     get 
     { 
      DateTime value = ObjectValue as DateTime; 
      if (value != null) return value; 
      return DateTime.TryParse(ObjectValue.ToString(), out value) ? value : new DateTime?(); 
     } 
    } 
İlgili konular