0

データ アクセスに Linq2SQL を使用するプロジェクトに取り組んでいます。このプロジェクトは、ASP.NET MVC アプリケーションと 8 つのクラス ライブラリで構成されています。ほとんどのクラス ライブラリには、独自の L2S データ クラスがあります。

私が行っている作業の一環として、テスト対象のさまざまなコンポーネントを取得して、コードベースをクリーンアップする安定性を導入しようとしています。現在、静的クラスとメソッドを多用しており、コントローラーには使用される静的 DataContexts があります。全体を通して。

コントローラーのアクションをテストできるように、L2S の使用をリファクタリングするにはどうすればよいですか?

アプリに依存性注入を導入して他のサービスの一部を切り離しましたが、DataContext とその DataLoadOptions のインスタンス化を制御したいので、DataContext をコントローラーの依存関係プロパティとして使用したくありません。

私が試したことの 1 つは、L2S が生成する部分クラスを利用して DataContext に Interface を追加することでしたが、抽象化がクラス ライブラリにとどまるのではなく、アプリケーションにバブルアップすることがわかりました。それは物事を行う正しい方法とは思えず、維持するのが面倒だと感じました。この方法で成功または失敗した人はいますか?

4

2 に答える 2

3

リポジトリ パターンを使用してDataContext内部を非表示にします。リポジトリは抽象化されているため、スイートは依存性注入の原則に非常に適しています。

たとえば、いくつかのリポジトリを定義します。

public interface IUserRepository
{
    User Get(int id);
    User Save(User user);
    void Delete(User user);
}

実装は次のようなものです

public class UserRepository : IUserRepository
{
    private MyDataContext _context;

    UserRepository() 
    {
        _context = new MyDataContext();
    }

   // ...

}

現在、コントローラーはインターフェースのみに依存しています。

public UserController : Controller
{
    UserController(IUserRepository userRepository) { }
}

したがって、テストでモックできるため、完全にテスト可能ですIUserRepository

于 2012-03-31T11:53:13.663 に答える
1

この記事では、エンティティ フレームワークを使用したテスト容易性について言及していますが、ここでは高レベルの概念を適用できます。

例の中心は、「作業単位」パターンと「リポジトリ」パターンを使用した概要です。作業単位は、データ コンテキストに関する抽象化であり、特定のコントローラーのワーキング セット、または同様のコントローラーのセットを表します。ユニットには複数のリポジトリを含めることができます。リポジトリは LINQ 機能に基づいているため、IEnumerableまたはIQueryable引き続き LINQ 機能を利用できます。

テスト容易性オプションには、ユニットとリポジトリのモックアウト、またはテスト目的でのメモリ内表現の作成が含まれます。

于 2012-04-01T16:54:28.457 に答える