Correzioni per problemi con SubSonic TestRepository 3 del
-
20-09-2019 - |
Domanda
Ho cercato di utilizzare SubSonic supporto repository di test 3.0 per unit testing, ma incontrato alcuni problemi, così ho pensato di loro mi documento, e le correzioni che è venuta in mente:
Colonne incremento automatico non funzionano
Ovviamente senza DB, colonne incremento automatico non funzionano automaticamente, ma se come me si sta utilizzando interi semplici o long per tutte le colonne di identità, questa correzione funziona bene:
(Questa è una copia da qui , incluso per completezza)
In ActiveRecord.tt:
1: In cima alla public void funzione di Aggiungi (fornitore IDataProvider) {
public void Add(IDataProvider provider){
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
if (TestMode)
{
this.<#=tbl.PK.CleanName#>=++next_test_autoid;
}
<#}#>
2: Sotto la linea public bool TestMode = false, aggiungere:
public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>
Oggetto uguaglianza di confronto è rotto
Utilizzando il modello di ActiveRecord di default, un oggetto uguaglianza non funziona. Quindi rimuovere elementi dalla DB non funziona in quanto il List <>. Togliere () utilizzato nella TestRepository non riesce ad abbinare l'elemento viene rimosso. Questo può essere risolto nei modelli TT con la seguente: (es: sostituire "==" con "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 non è implementato nel repository di test
Operazioni come questa records.Delete(x => x.whatever == whatever)
falliscono contro il repo test perché DeleteMany non è implementata. Fissare questo richiede sempre l'origine e la costruzione di se stessi, ma qui è un'implementazione che sembra funzionare:
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;
}
Soluzione
Grazie per questo - ma la cosa migliore da fare è quello di raccontarci i vostri problemi :). StackOverflow è più per rispondere alle domande - Potrei suggerire di dirigersi verso Github e controllando l'ultima fonte (abbiamo risolto un certo numero di questi). Se si vede che alcune cose possono essere fissati - patch sono i benvenuti
.Altri suggerimenti
Per quanto riguarda il punto 2, questo è ancora rotto, se il record non è ancora stato salvato, in quanto è il confronto sulle KeyValue (). Per garantire che i record non salvati hanno anche una vera parità, dobbiamo anche verificare se il record isNew, e in caso affermativo, determinare un'altra strategia per la parità