Subsonic 3のTestRepositoryの問題の修正
-
20-09-2019 - |
質問
私はユニットテストのためにSubsonic 3.0のテストリポジトリサポートを使用しようとしていましたが、いくつかの問題に遭遇したので、それらを文書化したと思いました。
自動インクリメント列は機能しません
明らかにDBがない場合、自動インクリメント列は自動的に動作しませんが、私のようにすべてのID列に単純なINTまたはロングを使用している場合、この修正はうまく機能します。
(これはからのコピーです ここ, 、完全性のために含まれています)
Activerecord.tt:
1:関数の上部でpublic void add(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:ラインの下でパブリックブールtestmode = false、add:
public bool TestMode = false;
<#if(tbl.PK.SysType=="long" || tbl.PK.SysType=="int") {#>
private static <#=tbl.PK.SysType#> next_test_autoid = 0;
<#}#>
オブジェクトの平等比較は壊れています
デフォルトのActiverCordテンプレートを使用すると、オブジェクトの等式は機能しません。したがって、TestRepositoryで使用されているリスト<>。remove()が削除されているアイテムと一致しないため、DBからアイテムを削除することは機能しません。これは、次のテンプレートでTTテンプレートで修正できます。
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はテストリポジトリに実装されていません
このような操作 records.Delete(x => x.whatever == whatever)
Deletemanyが実装されていないため、テストリポジトリに失敗します。これを修正するには、ソースを取得して自分で構築する必要がありますが、ここに機能するように思われる実装があります。
TestRepository.cs:
public int DeleteMany(Expression<Func<T, bool>> expression)
{
foreach (var x in _items.AsQueryable().Where(expression).ToList())
{
_items.Remove(x);
}
return 0;
}
解決
これをありがとう - しかし、最善のことはあなたの問題について私たちに話すことです:)。 StackOverFlowは質問に答えるためのものです。GitHubに向かい、最新のソースをチェックすることをお勧めします(これらの多くを修正しました)。いくつかのものを修正できることがわかった場合 - パッチは大歓迎です。
他のヒント
ポイント2に関しては、KeyValue()で比較されているため、レコードがまだ保存されていない場合、これはまだ壊れています。救われていないレコードに真の平等があることを確認するには、レコードが新しいかどうかをテストする必要があります。もしそうなら、別の平等戦略を決定する必要があります