私のアプリケーション
次のようなアプリケーション設計があります。
- Web アプリケーション層 - POCO と呼び出しサービスを使用するコントローラーとビューを備えた asp.net MVC アプリ
- サービス層 - POCO を使用してリポジトリを呼び出すビジネス プロセス
- データ層 - POCO を使用し、この同じ層の一部である EF モデルの形式でモデルと通信するリポジトリ
- POCO レイヤー - これらのレイヤー間の相互通信に使用されるすべてのクラスを定義します
したがって、上位層はデータエンティティをまったく使用しないため、私のデータ層はデータモデルの実装に対して完全に透過的です。
テスト
私がユニット、統合、およびシステムテスト(Asp.net MVCに関連して)を理解している限り、これは次のとおりです。
- 単体テスト - これは簡単です。分離されたオブジェクトをモックし、単体テストに挿入して、テストされたユニットがそれらを使用するようにします
- 統合テスト - 本番機能ユニットのグループを作成し、残りをモックする必要があります。したがって、本番データベースを実際に使用せずにコントローラー、サービス、リポジトリの統合をテストする統合テストを作成します
- システム テスト - モックを作成せずにすべてのレイヤーでテストを実行します。つまり、本番 (テスト) データベースも使用する必要があります。
問題
単体テストやシステムテストの書き方は簡単にわかるが、統合テストの書き方がわからない?これらに対する私の見方は完全に歪んでいて、まったく理解できていないのかもしれません。
Asp.net MVC アプリケーションの統合およびシステム テストをどのように作成する必要がありますか?
または、その問題のための.netアプリケーションはありますか?
問題の説明に役立つコード
次のようなクラスがあるとします。
TaskController
呼び出しますTaskService
TaskService
呼び出しますTaskRepository
TaskRepository
EF データを内部で操作する
だからここに私の(省略された)クラスがあります:
public class TaskController
{
private ITaskService service;
// injection constructor
public TaskController(ITaskService service)
{
this.service = service;
}
// default constructor
public TaskController() : this(new TaskService()) {}
public ActionResult GetTasks()
{
return View(this.service.GetTasks());
}
...
}
public class TaskService : ITaskService
{
private ITaskRepository repository;
// injection constructor
public TaskService(ITaskRepository repository)
{
this.repository = repository;
}
// default constructor
public TaskService() : this(new TaskRepository()) {}
public IList<Task> GetTasks()
{
return this.repository.GetTasks();
}
...
}
public class TaskRepository : ITaskRepository
{
public IList<Task> GetTasks()
{
// code that gets tasks from EF and converts to Task POCOs
}
...
}
単体テストは単純で、次のようになります。
public void UnitTest()
{
var mock = new Mock<ITaskService>();
// other code that mocks the service
TaskController controller = new TaskController(mock.Object);
// do the test
}
しかし、統合テストに関して言えば、統合の特定の部分だけをモックするにはどうすればよいでしょうか。
public void IntegrationTest()
{
// no mocking at all
TaskController = new TaskController();
// do some testing
}
まず、ここでデータベースをモックすることはできませんか? リポジトリをモックして、実際のサービスとコントローラーを使用することはできますが...