質問

私はユニットテストのために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()で比較されているため、レコードがまだ保存されていない場合、これはまだ壊れています。救われていないレコードに真の平等があることを確認するには、レコードが新しいかどうかをテストする必要があります。もしそうなら、別の平等戦略を決定する必要があります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top