2017-03-08 8 views
1

그래서 첫 번째 TestMethod가 예상대로 진행되었습니다. 내 SetValue 방법을 테스트했습니다.SetValue 테스트는 내 Period 클래스에서는 성공하지만 내 Name 클래스에서는 실패합니다.

p1 = new DateTimePeriod { From = DateTime.MinValue, To = DateTime.MaxValue }; 
p2 = new DateTimePeriod { From = DateTime.MaxValue, To = DateTime.MinValue }; 

[TestMethod] 
public void SetPeriodTest() 
{ 
    b.SetValue(ref p1, p2); 
    Assert.AreEqual(DateTime.MaxValue, p1.From); 
    Assert.AreEqual(DateTime.MinValue, p1.To); 
} 

하지만 다음 테스트는 실패합니다. 분명히 x.AName, x.Validx.Id이 null인데 분명히 p1.Fromp1.To을 설정 한 것과 같습니다. 왜 이러한 속성이 null을 반환합니까?

[TestMethod] 
public void SetNameTest() 
{ 
    var x = new Name { AName = "Jack", Valid = p1, Id = "123" }; 
    var y = new Name { AName = "John", Valid = p2, Id = "321" }; 
    b.SetValue(ref x, y); 
    Assert.AreEqual("John", x.AName); 
    Assert.AreEqual(p2, x.Valid); 
    Assert.AreEqual("321", x.Id); 
} 

편집 :

public class Name: Base 
{ 
    private string id; 
    public string Id 
    { 
     get { return id; } 
     set { SetValue(ref id, value); } 
    } 
    private string aName; 
    public string AName 
    { 
     get { return aName; } 
     set { SetValue(ref aName, value); } 
    } 
    private DateTimePeriod valid; 
    public DateTimePeriod Valid 
    { 
     get { return valid; } 
     set { SetValue(ref valid, value); } 
    } 
} 

public class DateTimePeriod: Period<DateTime> 
{ 
} 

public class Period<T>: Base 
{ 
    private T from; 
    private T to; 
    public Period() 
    { 
     from = default(T); 
     to = default(T); 
    } 
    public T From 
    { 
     get { return from; } 
     set { SetValue(ref from, value); } 
    } 
    public T To 
    { 
     get { return to; } 
     set { SetValue(ref to, value); } 
    } 
} 

EDIT2 :

I는 단위 테스트에서 코드를 디버깅 할 경우
public class Base: object 
{ 
    public void SetValue<T>(ref T field, T value) 
    { 
     if (field == null) return; 
     if (field.Equals(value)) return; 
     field = value; 
     DoOnChanged(); 
    } 
    public event EventHandler OnChanged; 
    protected void DoOnChanged() 
    { 
     if (OnChanged == null) return; 
     OnChanged(this, null); 
    } 
} 
+0

은 x.AName이므로 null 또는 y도 마찬가지입니까? – SeeuD1

+0

모두 null입니다 ... –

답변

0

, 아무 문제없이 작동 오기 '. 나는 당신이 BaseSetValue을 위해 무엇을 사용하는지 알지 못하기 때문에 세터를 정상적인 사용으로 바꿨습니다.

그러나 단위 테스트

이 코드와 함께 잘 작동됩니다
namespace SampleUnitTest 
{ 
    [TestClass] 
    public class Foo 
    { 
     [TestMethod] 
     public void Bar() 
     { 
      var p1 = new DateTimePeriod { From = DateTime.MinValue, To = DateTime.MaxValue }; 
      var p2 = new DateTimePeriod { From = DateTime.MaxValue, To = DateTime.MinValue }; 
      var x = new Name { AName = "Jack", Valid = p1, Id = "123" }; 
      var y = new Name { AName = "John", Valid = p2, Id = "321" }; 
      Assert.AreEqual("John", x.AName); 
      Assert.AreEqual(p2, x.Valid); 
      Assert.AreEqual("321", x.Id); 
     } 
    } 

    public class Name 
    { 
     private string id; 
     public string Id 
     { 
      get { return id; } 
      set { id = value; } 
     } 
     private string aName; 
     public string AName 
     { 
      get { return aName; } 
      set { aName = value; ; } 
     } 
     private DateTimePeriod valid; 
     public DateTimePeriod Valid 
     { 
      get { return valid; } 
      set { valid = value ; } 
     } 
    } 

    public class DateTimePeriod : Period<DateTime> 
    { 
    } 

    public class Period<T> 
    { 
     private T from; 
     private T to; 
     public Period() 
     { 
      from = default(T); 
      to = default(T); 
     } 
     public T From 
     { 
      get { return from; } 
      set { from = value; } 
     } 
     public T To 
     { 
      get { return to; } 
      set { to = value; } 
     } 
    } 
} 

내가 SetValue은 또한 당신의 DateTime가 작동하고 다른 클래스하지는 이유라고 생각합니다.

+0

초기화했습니다. 실제로 [TestInitialize]에 있지만 코드는 AName 및 Id에서도 작동하지 않습니다. –

+0

전체 testmethod를 게시 할 수 있습니까? – SeeuD1

+0

기본적으로 당신의 대답과 같습니다. DateTimePeriod (DateTime 값 포함)가 작동하지만 Name (Strings 및 DateTime 포함)이 작동하지 않는 이유를 이해하는 데 문제가 있습니다. 다른 유형을 사용하는 클래스는 속성 값을 제공 할 수 없지만 DateTime 값만 사용하는 클래스는 완벽하게 작동합니다. –