有没有人对单元测试其用户类型有好的方法?

举例来说,我的模型中有一个名为DateRange的对象,该对象的DatePoint开始和DatePoint结束。除了使范围类型操作可用于两个日期时间外,这些对象还使我能够调整手头任务的精度(即日,时,分等)。当存储到我正在处理的应用程序的数据库中时,我只需要将开始和结束存储为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;
    }
}


}

现在,我正在寻找一种证明其有效的方法。提前致谢!

干杯,
贝里

最佳答案

我为System.Drawing.Color创建了一个用户类型,这是我如何使用MSTest和Moq对它进行单元测试。

ColorUserType.cs:

公共类ColorUserType:IUserType
{
公共对象组装(对象已缓存,对象所有者)
{
返回缓存;
}

公共对象DeepCopy(对象值)
{
返回值
}

公共对象Disassemble(对象值)
{
返回值
}

公共新布尔Equals(object x,object y)
{
if(ReferenceEquals(x,y))
{
返回true;
}
if(x == null || y == null)
{
返回false;
}
返回x.Equals(y);
}

公共诠释GetHashCode(对象x)
{
返回x == null吗? typeof(Color).GetHashCode()+ 473:x.GetHashCode();
}

公共布尔IsMutable
{
得到
{
返回true;
}
}

公共对象NullSafeGet(IDataReader rs,字符串[]名称,对象所有者)
{
var obj = NHibernateUtil.String.NullSafeGet(rs,names [0]);
if(obj == null)
{
返回null;
}
返回ColorTranslator.FromHtml((string)obj);
}

公共无效NullSafeSet(IDbCommand cmd,对象值,整数索引)
{
if(值== null)
{
((IDataParameter)cmd.Parameters [index]).Value = DBNull.Value;
}
其他
{
((IDataParameter)cmd.Parameters [index]).Value = ColorTranslator.ToHtml((Color)value);
}
}

公共对象Replace(对象原始,对象目标,对象所有者)
{
退回原件;
}

公共类型ReturnedType
{
得到
{
返回typeof(Color);
}
}

公共SqlType [] SqlTypes
{
得到
{
返回new [] {new SqlType(DbType.StringFixedLength)};
}
}
}


ColorUserTypeTests.cs

[TestClass]
公共类ColorUserTypeTests
{
公共TestContext TestContext {get;组; }

[测试方法]
公共无效AssembleTest()
{
var color = Color.Azure;
var userType = new ColorUserType();
var val = userType.Assemble(color,null);
Assert.AreEqual(color,val);
}

[测试方法]
公共无效DeepCopyTest()
{
var color = Color.Azure;
var userType = new ColorUserType();
var val = userType.DeepCopy(color);
Assert.AreEqual(color,val);
}

[测试方法]
公共无效DissasembleTest()
{
var color = Color.Azure;
var userType = new ColorUserType();
var val = userType.Disassemble(color);
Assert.AreEqual(color,val);
}

[测试方法]
公共无效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));
}

[测试方法]
公共无效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));
}

[测试方法]
公共无效的IsMutableTest()
{
var userType = new ColorUserType();
Assert.IsTrue(userType.IsMutable);
}

[测试方法]
公共无效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,“返回了错误的颜色。”);

dataReaderMock.Setup(m => m.IsDBNull(It.IsAny()))。Returns(true);
Assert.IsNull(userType.NullSafeGet(dataReaderMock.Object,new [] {“ black”},null),“颜色不为null。”);

dataReaderMock.VerifyAll();
}

[测试方法]
公共无效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();
}

[测试方法]
公共无效ReplaceTest()
{
var color = Color.Azure;
var userType = new ColorUserType();
Assert.AreEqual(color,userType.Replace(color,null,null));
}

[测试方法]
公共无效ReturnedTypeTest()
{
var userType = new ColorUserType();
Assert.AreEqual(typeof(Color),userType.ReturnedType);
}

[测试方法]
公共无效SqlTypesTest()
{
var userType = new ColorUserType();
Assert.AreEqual(1,userType.SqlTypes.Length);
Assert.AreEqual(new SqlType(DbType.StringFixedLength),userType.SqlTypes [0]);
}
}

关于unit-testing - 单元测试NHibernate用户类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1044355/

10-11 15:20