Unit-Tests NHibernate UserTypes
-
20-08-2019 - |
Frage
Hat jemand einen guten Ansatz zur Einheit ihre UserTypes testen?
Als Beispiel habe ich ein Objekt in meinem Modell namens Daterange, die ein DatePoint Ende beginnen und DatePoint hat. Neben Bereichstyp Operationen für zwei Datetime verfügbar zu machen, lassen Sie diese Objekte mir die Präzision für die Aufgabe zur Hand einstellen (das heißt, Tag, Stunde, Minute, etc.). Wenn für eine Anwendung auf den db gespeichert arbeite ich an, ich brauche nur den Anfang und das Ende als Datum- und zu speichern, man darf nicht NULL-Werte. Ich kann nicht glauben, wie diese zur Karte ohne Usertype, so habe ich:
/// <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;
}
}
}
Jetzt nach einem Weg, ich bin auf der Suche zu beweisen, dass es funktioniert. Vielen Dank im Voraus!
Cheers, Berryl
Lösung
Ich habe einen Benutzertyp für System.Drawing.Color, und hier ist, wie ich es Einheit mit MSTest getestet und
Andere Tipps
Ich dachte ich einige der Abhängigkeiten / Fälschung hier verspotten konnte, aber der beste Weg, die Entscheidung liquidiert dies durch die Verwendung einer Datenbank zu tun war.
Einige Dinge, die ich auf dem Weg gelernt:
1) es ist die Mühe wert, wenn Techniken NHibernate Lernen einer Art und Weise einen eigenen Satz von Werkzeugen zu haben, einschließlich, um schnell eine db und Prüfadapter für sie (die gleichen Arten von agilen Tools konfigurieren Sie für alles andere brauchen, wirklich) und ein dediziertes Testlabor, das Sie keine emotionale Investition haben in.
2) spottet nicht selbst verleihen Ihnen nicht Schnittstellen Sie besitzen, wie IDataReader.
Prost