Korrekturen für Probleme mit dem Testrepository von SubSonic 3
-
20-09-2019 - |
Frage
Ich habe versucht, die Test -Repository -Unterstützung von SubSonic 3.0 für Unit -Tests zu verwenden, aber ein paar Probleme, also dachte ich, ich dokumentiere sie und die Korrekturen, die ich mir vorgestellt habe:
Automatische Inkrementspalten funktionieren nicht
Offensichtlich funktionieren die automatischen Inkrement-Spalten ohne DB nicht automatisch, aber wenn Sie wie ich einfache INTs verwenden oder sich nach allen Identitätsspalten sehnt, funktioniert diese Fix gut:
(Dies ist eine Kopie von hier, zur Vollständigkeit enthalten)
In activerecord.tt:
1: Oben in der Funktion public void add (idataprovider -Anbieter) {
public void Add(IDataProvider provider){
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
if (TestMode)
{
this.<#=tbl.PK.CleanName#>=++next_test_autoid;
}
<#}#>
2: Unter der Linie Public bool testMode = false, fügen Sie hinzu:
public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>
Der Vergleich der Objektgleichheit ist gebrochen
Unter Verwendung der Standard -ActiveCord -Vorlage funktioniert die Objektgleichheit nicht. Das Entfernen von Elementen aus der DB funktioniert also nicht, da die im Testrepository verwendete Liste <>. REMED () nicht mit dem zu entfernenden Element übereinstimmt. Dies kann in den TT -Vorlagen mit Folgendem fixiert werden: (dh ersetzt "==" durch "Equals ()")
In activerecord.tt:
public override bool Equals(object obj){
if(obj.GetType()==typeof(<#=tbl.ClassName#>)){
<#=tbl.ClassName#> compare=(<#=tbl.ClassName#>)obj;
return compare.KeyValue().Equals(this.KeyValue());
}else{
return base.Equals(obj);
}
}
Deletemany wird im Test -Repository nicht implementiert
Operationen wie diese records.Delete(x => x.whatever == whatever)
Versagen Sie gegen das Test -Repo, da das Deletemany nicht umgesetzt wird. Wenn Sie dies beheben, müssen Sie die Quelle erhalten und sich selbst aufbauen, aber hier ist eine Implementierung, die zu funktionieren scheint:
In testRepository.cs:
public int DeleteMany(Expression<Func<T, bool>> expression)
{
foreach (var x in _items.AsQueryable().Where(expression).ToList())
{
_items.Remove(x);
}
return 0;
}
Lösung
Vielen Dank dafür - aber das Beste, was Sie tun können, ist, uns über Ihre Probleme zu erzählen :). Stackoverflow ist mehr zur Beantwortung von Fragen gedacht - ich könnte vorschlagen, zu GitHub zu gehen und die neueste Quelle zu überprüfen (wir haben einige davon behoben). Wenn Sie sehen, dass einige Dinge repariert werden können - sind Patches sehr willkommen.
Andere Tipps
In Bezug auf Punkt 2 ist dies immer noch kaputt, wenn der Datensatz noch nicht gespeichert ist, da er auf KeyValue () verglichen wird. Um sicherzustellen, dass nicht-saspurische Aufzeichnungen auch eine wahre Gleichheit haben, müssen wir auch testen, ob der Datensatz ist und in diesem Fall eine andere Gleichstellungsstrategie bestimmen