有没有人对单元测试其用户类型有好的方法?
举例来说,我的模型中有一个名为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/