ASP.NET MVCフレームワークでのユニットテスト

ASP.NET MVCフレームワークに関するレポートを作成している間に、このフレームワークが開発者に開発でTDDプラクティスを使用する機会を与えていることに気づき、すぐにTDDとは何か、ASP.NET MVCフレームワークがこれらの機能を正確に提供する方法について質問を受けました。





ASP.NET MVCフレームワーク+ TDD



開発者は、ASP.NET MVC Webアプリケーションテンプレートを使用してプロジェクトを作成しようとするとすぐに、TDDの最初のヒントを取得します。 テスト用に別のプロジェクトを作成することがすぐに提案されます。



この場合、標準のMSテスト技術を使用することが提案されていますが、インターネット上でxUnit、MbUnit、およびnUnitを追加する方法があります 。 このヒントを使用すると、テストに必要なすべてのライブラリが接続される別のプロジェクトが取得され、1つのクラスとメソッドを含むcsファイルが作成されます。その後、すべてをペンで行う必要があります。



プレビュー2以降、すべてのActionメソッドは結果を返すはずです。 結果は、ベースタイプActionResult(ViewResult、JsonResult、ActionRedirectResultなど)から継承された任意のクラスになります。 したがって、テスト時に、メソッドがViewに渡すデータ(ViewData)を簡単に確認できます。

ViewResult data = blogController.Comments(5);

Assert.AreEqual(expect, data.ViewData.Model);


* This source code was highlighted with Source Code Highlighter .






さらに、メソッドがViewResultを返す場合、どのビューが使用されるかを簡単に確認できます。

ViewResult data = blogController.Comments(5);

Assert.AreEqual( "comments" , data.ViewName);




* This source code was highlighted with Source Code Highlighter .








また、フレームワーク自体には単一の封印されたクラスはなく、すべてのタイプはインターフェース(IView、IController)上に構築されるか、独自の基本抽象クラス(HttpResponseBase、HttpSessionStateBase)を持ちます。 このアプローチにより、テスト中にクラスを簡単に濡らすことができます。 これにより、たとえば、ルートをテストできます。



var httpContextMock = new Mock<HttpContextBase>();

var requestMock = new Mock<HttpRequestBase>();

httpContextMock.Expect(c => c.Request).Returns(requestMock.Object);

requestMock.Expect(r => r.AppRelativeCurrentExecutionFilePath)

.Returns(url);



RouteData routeData = routes.GetRouteData(httpContextMock.Object);

Assert.IsNotNull(routeData, "Should have found the route" );




* This source code was highlighted with Source Code Highlighter .








そのため、このテクノロジーにTDDアプローチを選択したMSは、エンドユーザーが簡単に例をたどることができるソリューションを使用せざるを得ません。



そのため、RC1では、目的のアクションメソッドのビューを自動的に作成することが可能になりました。先に進んで、一連のテストを自動的に作成する機能を組み込んでみてください(もちろん、すべてのテストケースをカバーすることはできませんが、最も繰り返されるテストケースは...)



さて、最後に、私のメソッドとnUnit-eでの表示方法をテストします。



テストとメソッドの小さな例。






  1. [テストフィクスチャ]
  2. パブリック クラス TestCase4BlogsController
  3. {
  4. [テスト]
  5. public void TestGetCommentsList_IfPutIDExistBlog()
  6. {
  7. MockModel mockModel = new MockModel();
  8. BlogController blogController = new BlogController();
  9. ArrayList expect = new ArrayList { new {Data = "これはあなたにとって魚ではありません、ダイナマイトとジャム" 、Date = "12.02.2009" 、Author = "Ivan Petrovich" }、
  10. new {Data = "ダイナマイトを使用したDuc、より効率的です" 、Date = "02/13/2009" 、Author = "Patsak" }、
  11. new {Data = "そして、この魚を後でどうしますか????" 、日付= "02/13/2009" 、作成者= "Ivan Petrovich" }};
  12. mockModel.comments = expect;
  13. blogController.Model = mockModel as IBlogModel;
  14. ViewResult data = blogController.Comments(5);
  15. Assert.AreEqual(expect、data.ViewData.Model);
  16. }
  17. }
*このソースコードは、 ソースコードハイライターで強調表示されました。








  1. パブリック クラス MockModel:IBlogModel
  2. {
  3. public ArrayList comments = null ;
  4. #region IBlogModelメンバー
  5. public ArrayList GetComment4Blog( int blogId)
  6. {
  7. コメントを返す ;
  8. }
  9. #endregion
  10. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




メソッドが作成される前。





メソッドの実装。





  1. [AcceptVerbs(HttpVerbs.Get)]
  2. パブリック ViewResultコメント( int blogId)
  3. {
  4. return View( "comments" 、Model.GetComment4Blog(blogId));
  5. }
*このソースコードは、 ソースコードハイライターで強調表示されました。




コンパイル後。








All Articles