2009-06-25 7 views
6

누구나 자신의 UserType 테스트 유닛에 대한 좋은 접근법을 가지고 있습니까?유닛 테스트 NHibernate UserTypes

예를 들어 DatePoint를 시작하고 DatePoint를 끝내는 DateRange라는 모델에 개체가 있습니다. 두 DateTimes에 대해 범위 유형 작업을 사용할 수있게하는 것 외에도이 객체를 통해 작업의 정확도 (즉, 일,시, 분 등)를 조정할 수 있습니다. 작업중인 응용 프로그램의 db에 저장 될 때 나는 시작과 끝을 DateTime으로 저장할 필요가 없으며 null도 허용되지 않습니다. 나는 UserType을하지 않고 매핑하는 방법을 생각할 수 없다, 그래서 나는이 : 지금은 작동 증명하는 방법을 찾고 있어요

/// <summary>User type to deal with <see cref="DateRange"/> persistence for time sheet tracking.</summary> 
public class TimePeriodType : IUserType 
{ 

    public SqlType[] SqlTypes { 
     get { 
      var types = new SqlType[2]; 
      types[0] = new SqlType(DbType.DateTime); 
      types[1] = new SqlType(DbType.DateTime); 
      return types; 

     } 
    } 

    public Type ReturnedType 
    { 
     get { return typeof(DateRange); } 
    } 

    /// <summary>Just return <see cref="DateRange.Equals(object)"/></summary> 
    public new bool Equals(object x, object y) 
    { 
     return x != null && x.Equals(y); 
    } 

    /// <summary>Just return <see cref="DateRange.GetHashCode"/></summary> 
    public int GetHashCode(object x) 
    { 
     return x.GetHashCode(); 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var start = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs, names[0]); 
     var end = (DateTime)NHibernateUtil.DateTime.NullSafeGet(rs, names[1]); 

     return new DateRange(start, end, TimeSlice.Minute); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) { 
     Check.RequireNotNull<DateRange>(value); 
     Check.RequireArgType<DateRange>(value); 
     var dateRange = ((DateRange)value); 

     NHibernateUtil.DateTime.NullSafeSet(cmd, dateRange.Start, index); 
     NHibernateUtil.DateTime.NullSafeSet(cmd, dateRange.End, index); 
    } 

    public object DeepCopy(object value) { 
     Check.RequireNotNull<DateRange>(value); 
     Check.RequireArgType<DateRange>(value); 
     var dateRange = ((DateRange) value); 

     return new DateRange(dateRange.Start, dateRange.End); 
    } 

    public bool IsMutable 
    { 
     get { return false; } 
    } 

    public object Replace(object original, object target, object owner) { 
     //because it is immutable so we can just return it as is 
     return original; 
    } 

    public object Assemble(object cached, object owner) { 
     //Used for caching, as it is immutable we can just return it as is 
     return cached; 
    } 

    public object Disassemble(object value) { 
     //Used for caching, as it is immutable we can just return it as is 
     return value; 
    } 
} 

}

. 미리 감사드립니다!

건배, Berryl

답변

8

나는 System.Drawing.Color에 대한 사용자 유형을 생성하고, 여기에 내가 단위 MSTEST 및 Moq으로 테스트하는 방법입니다.

ColorUserType.cs :

 
public class ColorUserType : IUserType 
{ 
    public object Assemble(object cached, object owner) 
    { 
     return cached; 
    } 

    public object DeepCopy(object value) 
    { 
     return value; 
    } 

    public object Disassemble(object value) 
    { 
     return value; 
    } 

    public new bool Equals(object x, object y) 
    { 
     if(ReferenceEquals(x, y)) 
     { 
      return true; 
     } 
     if(x == null || y == null) 
     { 
      return false; 
     } 
     return x.Equals(y); 
    } 

    public int GetHashCode(object x) 
    { 
     return x == null ? typeof(Color).GetHashCode() + 473 : x.GetHashCode(); 
    } 

    public bool IsMutable 
    { 
     get 
     { 
      return true; 
     } 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]); 
     if(obj == null) 
     { 
      return null; 
     } 
     return ColorTranslator.FromHtml((string)obj); 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     if(value == null) 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value; 
     } 
     else 
     { 
      ((IDataParameter)cmd.Parameters[index]).Value = ColorTranslator.ToHtml((Color)value); 
     } 
    } 

    public object Replace(object original, object target, object owner) 
    { 
     return original; 
    } 

    public Type ReturnedType 
    { 
     get 
     { 
      return typeof(Color); 
     } 
    } 

    public SqlType[] SqlTypes 
    { 
     get 
     { 
      return new[] { new SqlType(DbType.StringFixedLength) }; 
     } 
    } 
} 

ColorUserTypeTests.cs

 
    [TestClass] 
    public class ColorUserTypeTests 
    { 
     public TestContext TestContext { get; set; } 

     [TestMethod] 
     public void AssembleTest() 
     { 
      var color = Color.Azure; 
      var userType = new ColorUserType(); 
      var val = userType.Assemble(color, null); 
      Assert.AreEqual(color, val); 
     } 

     [TestMethod] 
     public void DeepCopyTest() 
     { 
      var color = Color.Azure; 
      var userType = new ColorUserType(); 
      var val = userType.DeepCopy(color); 
      Assert.AreEqual(color, val); 
     } 

     [TestMethod] 
     public void DissasembleTest() 
     { 
      var color = Color.Azure; 
      var userType = new ColorUserType(); 
      var val = userType.Disassemble(color); 
      Assert.AreEqual(color, val); 
     } 

     [TestMethod] 
     public void EqualsTest() 
     { 
      var color1 = Color.Azure; 
      var color2 = Color.Bisque; 
      var color3 = Color.Azure; 
      var userType = new ColorUserType(); 

      var obj1 = (object)color1; 
      var obj2 = obj1; 

      Assert.IsFalse(userType.Equals(color1, color2)); 
      Assert.IsTrue(userType.Equals(color1, color1)); 
      Assert.IsTrue(userType.Equals(color1, color3)); 
      Assert.IsFalse(userType.Equals(color1, null)); 
      Assert.IsFalse(userType.Equals(null, color1)); 
      Assert.IsTrue(userType.Equals(null, null)); 
      Assert.IsTrue(userType.Equals(obj1, obj2)); 
     } 

     [TestMethod] 
     public void GetHashCodeTest() 
     { 
      var color = Color.Azure; 
      var userType = new ColorUserType(); 

      Assert.AreEqual(color.GetHashCode(), userType.GetHashCode(color)); 
      Assert.AreEqual(typeof(Color).GetHashCode() + 473, userType.GetHashCode(null)); 
     } 

     [TestMethod] 
     public void IsMutableTest() 
     { 
      var userType = new ColorUserType(); 
      Assert.IsTrue(userType.IsMutable); 
     } 

     [TestMethod] 
     public void NullSafeGetTest() 
     { 
      var dataReaderMock = new Mock(); 
      dataReaderMock.Setup(m => m.GetOrdinal("white")).Returns(0); 
      dataReaderMock.Setup(m => m.IsDBNull(0)).Returns(false); 
      dataReaderMock.Setup(m => m[0]).Returns("#ffffff"); 

      var userType = new ColorUserType(); 
      var val = (Color)userType.NullSafeGet(dataReaderMock.Object, new[] { "white" }, null); 

      Assert.AreEqual("ffffffff", val.Name, "The wrong color was returned."); 

      dataReaderMock.Setup(m => m.IsDBNull(It.IsAny())).Returns(true); 
      Assert.IsNull(userType.NullSafeGet(dataReaderMock.Object, new[] { "black" }, null), "The color was not null."); 

      dataReaderMock.VerifyAll(); 
     } 

     [TestMethod] 
     public void NullSafeSetTest() 
     { 
      const string color = "#ffffff"; 
      const int index = 0; 

      var mockFactory = new MockFactory(MockBehavior.Default); 

      var parameterMock = mockFactory.Create(); 
      parameterMock.SetupProperty(p => p.Value, string.Empty); 

      var parameterCollectionMock = mockFactory.Create(); 
      parameterCollectionMock.Setup(m => m[0]).Returns(parameterMock.Object); 

      var commandMock = mockFactory.Create(); 
      commandMock.Setup(m => m.Parameters).Returns(parameterCollectionMock.Object); 

      var userType = new ColorUserType(); 

      userType.NullSafeSet(commandMock.Object, ColorTranslator.FromHtml(color), index); 
      Assert.AreEqual(0, string.Compare((string)((IDataParameter)commandMock.Object.Parameters[0]).Value, color, true)); 

      userType.NullSafeSet(commandMock.Object, null, index); 
      Assert.AreEqual(DBNull.Value, ((IDataParameter)commandMock.Object.Parameters[0]).Value); 

      mockFactory.VerifyAll(); 
     } 

     [TestMethod] 
     public void ReplaceTest() 
     { 
      var color = Color.Azure; 
      var userType = new ColorUserType(); 
      Assert.AreEqual(color, userType.Replace(color, null, null)); 
     } 

     [TestMethod] 
     public void ReturnedTypeTest() 
     { 
      var userType = new ColorUserType(); 
      Assert.AreEqual(typeof(Color), userType.ReturnedType); 
     } 

     [TestMethod] 
     public void SqlTypesTest() 
     { 
      var userType = new ColorUserType(); 
      Assert.AreEqual(1, userType.SqlTypes.Length); 
      Assert.AreEqual(new SqlType(DbType.StringFixedLength), userType.SqlTypes[0]); 
     } 
    } 
0

나는 내가 여기에/가짜에게 종속의 일부를 조롱 수있다 생각하지만,이 데이터베이스를 사용했다 할 수있는 최선의 방법을 결정 감아했다.

내가 길을 따라 배운 몇 가지 :

1) 신속 그것을 위해 DB 및 시험 설비 (같은 종류를 구성하는 방법을 포함하여 도구의 전용 세트를 가지고 NHibernate에 기술을 학습 노력의 가치를 실제로 당신이 필요로하는 애자일 도구와 감정적 인 투자가없는 헌신적 인 테스트 실험실)

2) mocks는 IDataReader와 같이 소유하지 않은 인터페이스에 적합하지 않습니다. .

건배