1

特にMoqを使用してTDDを学習および実装しようとしていますが、モックの作成方法がわからない設計に直面しました。

namespace RIACompletelyRelativeWebService.Web.Services
{
    [EnableClientAccess]
    public class AncestorDomainService : TableDomainService<AncestorEntityContext>
    {
        public AncestorDomainService()
        {
            //this.EntityContext = new AncestorEntityContext();
        }
        public IQueryable<AncestorEntity> GetAncestorEntities()
        {
            return this.EntityContext.AncestorEntities;
        }

        public void AddAncestorEntity(AncestorEntity entity)
        {
            this.EntityContext.AncestorEntities.Add(entity);
        }
    }
}

Azureを起動せずにAncestorDomainServiceロジックをテストできるように、TableDomainServiceをモックする必要があると思います。私はこのようなものを疲れました:

public class AncestorDomainService<TEntityContext> : TableDomainService<TEntityContext> where TEntityContext is a TableEntityContext

しかし、TableDomainServiceは、ジェネリックが使用されることを好みませんでした。EntityContextも設定してみましたが、読み取り専用です。他の人が汎用のDomainServiceとリポジトリのデザインパターンを使用しているのを見てきましたが、TableDomainServiceを使用するとAzureテーブルを舞台裏で使用できるため、TableDomainService<>を使用する必要があると思います。返されるTableDomainService、TableEntityContext、およびTableEntitySetを偽造する必要がありますか?

4

2 に答える 2

2

上記のコードから、テストするロジックがどのように見えるかはわかりませんが、コード(テストするコード)をサービス自体から分離してみてください。

AncestorDomainServiceを抽象化して(IAncestorDomainServiceを導入)、moqを使用してIAncestorDomainServiceをモックすることができます。ロジックは、IAncestorDomainServiceに依存する別のクラスに移動します。私はLinq2Sqlでこれを行いました(これは同様のデザインを持っているようで、IQueryableも返します)。TableDomainServiceの「内部」をモックしようとはしません。これは通常、このようなものは簡単なテスト用に設計されていないためです。

于 2011-03-14T08:05:51.187 に答える
0

時間があれば、コードを完全にテストできるようにするのが最善の解決策です。これは、Azureのインスタンス(実際のインスタンスまたはローカル)を既知の良好な状態でセットアップするために必要なスクリプトを実際に用意することを意味します。

AncestorDomainServiceの全体的なポイントはAzureを処理することであるため、その基本クラスをモックアウトすることは、テストの有効性の観点からはあまり意味がありません。(有効性よりもテスト速度を最適化することを選択する人もいますが、それは時間の無駄だと思います。)

于 2011-08-22T02:34:01.553 に答える