2011-11-03 21 views
2

NUnit/JUnit /などの経験が豊富ですが、以前はASP.NET MVC3アプリケーションをテストしたことがありません。およびTDD。私の質問は、私はMVCアプリケーションをテストするためにどのような戦略を使用できますか?ASP.NET MVCアプリケーションの統合テスト

編集:ここに私の焦点は、統合テストに焦点を当て、また、テスト戦略を中心に、主にある、と - 彼らは私のアプリケーションを介してクリックすると、実際のユーザーが通過するかをテストします。

設定はです。プロジェクトによっては、ORM(NHibernateまたはDapper)によってASP.NET MVCが設定されています。

NUnitに似たWebベースのテストスイートがありますか?私は1つ書く必要がありますか?または私は(何とか)私のアプリケーションを何百万という小さなWeb以外のDLLに分割し、それらをNUnitでテストしようとしますか? (ORM層としてのActiveRecord/NHibernateのであっても可能ですか?)

アプリのこの種をテストするために何をしますか?

は、私は同様のSOの質問を見て、そしてずっと、他よりも見つけることができませんでした「ここでコントローラをテストする方法です。」

+0

mvcは非常に初めから簡単にテストできるように構築されており、コントローラメソッド、ビュー、モデルを個別にテストすることができます。NUnitに似たスイートの種類はありますか?どうしてNUnitだけを使用しないのですか?また、R#を使用するとNUnitテストを簡単に実行できます – vittore

答えて

3

テストのさまざまな種類があります:あなたはユニットテストについて話している場合はユニット、統合、受け入れ、...

は、ASP.NET MVCは心のテスト容易に構築されています。これらの概念を説明する記事が多数あります。ここにはone exampleがあります。そしてanother one。しかも、another one。アプリケーションを単体テスト可能にするには、異なるレイヤー間の結合が弱いようにアプリケーションを設計する必要があります。たとえば、コントローラが使用するインターフェイスの背後にあるすべてのデータアクセスを抽象化します。具体的な実装(NHibernateなど)をコントローラに渡すDIフレームワークを使用し、単体テストでは、データアクセスレイヤをスタブし、このコントローラを完全に分離してテストするための模擬フレームワークを使用できます。

+0

+1これは私が探しているもののようです。 Railsにはこのツールがあります。「このURLに移動してこのリンクをクリックすると、HTMLに「blah blah blah」が含まれていることを確認できます。何とかMVC3で可能ですか? (私はあなたのリンクを詳しく見ていませんでした) – ashes999

+1

@ ashes999、Visual Studioのテスト版またはアルティメット版をお持ちの場合は、[Webと負荷テスト](http://blogs.msdn。 com/b/amit_chatterjee/archive/2009/01/29/web-and-load-testing-with-visual-studio-team-system.aspx)を参照してください。そうでない場合は、[WatiN](http://watin.org/)をご覧ください。 –

0

あなたはすでに、これらの戦略は、単にMVC Webアプリケーションをテストするユニットに適用する必要がNUnitの/ JUnitのとTDDに精通している場合。

Webベースのテストスイートを記述する必要はありません、また「万人の」小さな非ウェブのdllのにあなたのアプリケーションを打破する必要が彼らです。つまり、テスト可能になるようにアプリケーションを設計する必要があります。

非常に単純なコントローラテストは次のようになります。私の例では、リポジトリ/ DIにMoqを使用していることに注意してください。

[Test] 
public void Edit_Get_Should_Lookup_Contact_From_Repository_And_Return_Edit_View() 
{ 
    // arrange 
    var _repository = new Mock<IContactRepository>(); 

    var expectedContact = new Contact 
    { 
     First = "first", 
     Last = "last", 
     Email = "[email protected]" 
    }; 

    var mockContext = new Mock<ControllerContext>(); 
    _repository.Setup(x => x.GetById(It.IsAny<int>())).Returns(expectedContact); 

    var controller = new ContactController(_repository.Object) 
    { 
     ControllerContext = mockContext.Object 
    }; 

    // act 
    var result = controller.Edit(1) as ViewResult; 
    var resultData = (Contact)result.ViewData.Model; 

    // assert 
    Assert.AreEqual("Edit", result.ViewName); 
    Assert.AreEqual(expectedContact.First, resultData.First); 
    Assert.AreEqual(expectedContact.Last, resultData.Last); 
    Assert.AreEqual(expectedContact.Email, resultData.Email); 
} 

[HttpGet] 
public ActionResult Edit(int id) 
{ 
    var contact = _repository.GetById(id); 

    return View("Edit", contact); 
} 

あなたは、ユニットテスト/ MVCのいくつかの例をもっと好きオタクディナーサンプルアプリケーションを閲覧したい場合:http://nerddinner.codeplex.com/

+0

この回答はユニットテストに対応しています。 – ashes999

+0

@ ashes999、私はあなたが今述べたタイプのテストにうまく使用しました:http:// watin。 org/ – Jesse

+0

それはダーリンも提案したものです。 – ashes999

0

私はそれはあなたがテストしたいものにdependeと思います。 UIからテストする場合は、SeleniumまたはWatinのようなUI用のドライバを使用する必要があります。

あなたも、あなたが例えばルビーでそうであるように、あなたが仕様書を書くことができ、これらのウェブドライバのいずれかと一緒にSpecflowを使用している場合。

私はUIがはるかに変更することを検討ので、私自身は、UIを通じてテストとして、これまでに行かないだろう。私は、コントローラをMVCアプリケーションに導入することに集中し、コントローラーを最小限のロジックで最小限に抑えるようにします。コントローラは、入力の基本的な検証を提供し、アプリケーションに委任するだけでよいはずです。

これはまた、アプリケーションの複雑さにもよりますが、大雑把なルールはそれを簡単に保つことです。

1

我々はASP.NET MVCアプリケーションの統合テストについて話しているときに考慮すべき2つの点があります:ユーザーが

  • テストスイートができるはずであるWebブラウザを使用して行うよう

    1. テストスイートは、アプリケーションと対話する必要がありますテストセッション中にWebアプリケーションのさまざまな部分を分離(模擬)します。

    これは、ここにあなたのケースであれば、私のrecipieです:ブラウザの活動をエミュレートするSelenium web driverを使用して、コマンドラインに

    iisexpress.exe /path:[path] /port:[port] 
    
  • を使用してIIS Expressを使用して

    1. ホストWebアプリケーション。モックWebアプリケーションコンポーネントへ

    2. gherkin言語でユーザーセッションを定義するための

    3. 使用SpecFlow使用Deleporter 私がこのアプローチについてarticle詳細を書かれている

    を実行している間。 このアプローチを実装したgithub repoもあります。

  • 関連する問題