3

どうやって始めたらいいのかわからないので、この2日間、この学習プロセスの開始と再開に費やしました。

Web、サービス、コアの3つのレイヤーを持つMVC4アプリケーションがあります。コントローラーはサービスレイヤーにリクエストを送信します。サービスレイヤーは、コントローラーがビューのviewModelsをハイドレイトするために使用する情報を提供します。

サービスレイヤーには次のメソッドがあります。

public interface ISetServices
{
    List<Set> GetBreadcrumbs(int? parentSetId);
    Set GetSet(int? setId);
    Set CreateSet(string name, string details, int? parentSetId);
    void DeleteSet(int? setId);

    Card GetCard(int? cardId);
    Card CreateCard(List<string> sides, string details, int? parentSetId);
    void DeleteCard(int? cardId);

    Side GetSide(int? sideId);
    List<String> GetSides(Card card);
    Side CreateSide(Card card, string content);
    void DeleteSide (int? sideId);

}

これらの関数をテストするためのユニットテストクラスライブラリを作成する方法を理解しようとしています。

テストを実行するときに、TestDatabaseを削除して(存在する場合)再作成し、データをシードしたいと思います。Coreプロジェクトに「保護された」シードメソッドがあります-これを使用できますか?もしそうなら、どのように?

私が読んだところはどこでも、テストでデータベースを使用しないように言っていますが、テストのポイントが何であるかを完全に理解することはできません。これらのサービスは、データベースにアクセスして更新するためのものです...テストするためにデータベースは必要ありませんか?

Project.Services.Tests単体テストプロジェクトを作成しましたが、すべてを接続する方法がわかりません。可能であれば、構成ファイルではなくコードを使用して実行したいと思います...例やポインターをいただければ幸いです。

4

1 に答える 1

2

この問題には多くの側面があります。いくつかアプローチしてみましょう。

  • 単体テストとは、コードのユニット、可能な限り最小のテスト可能なコードをテストすることですが、データベースとの相互作用を使用してコードのユニットをテストすることは、統合テストの問題です。
  • リポジトリパターンを使用することによるこの問題への1つのアプローチ-それはデータアクセス層上の抽象化層です。あなたのサービスインターフェースは、リポジトリパターンの実装のように見えます。
  • リポジトリパターンの内部をテストせず、そのインターフェイスに対して呼び出しをアサートするだけの人もいます。データベーステストは、統合テストの問題と見なされます。
  • 一部の人々は、単体テストでSetUpステップとTearDownステップを記述してデータベースに直接アクセスします。通常、SetUpに適切なデータを挿入すると、TearDownによってすべてが以前の状態にクリーンアップされますが、かなり遅くなり、あなたのユニットは痛みをテストします。
  • 他のアプローチは、SQLCEなどの別のデータベースを使用するようにテストを構成することです。一部のORMの場合、データベースの交換は非常に簡単な場合があります。これは「完全な」データベースをヒットするよりも速く、よりクリーンに見えますが、データベースの実装には、遅かれ早かれ表面化して単体テストを苦痛にする違いがあります...
  • 現在、NoSQLソリューションの台頭により、データベースに直接アクセスすることは非常に簡単になります。これは、対応するメモリ(RavenDBなど)が非常に頻繁にあるためです。

最初は少し圧倒されるかもしれませんが、やはりこの問題には多くの側面があります。ソースコードをgithubに投稿して、ここで共有してみませんか?

于 2013-02-22T09:54:46.920 に答える