0

MVC 2とMVC 2を使用しています。ASP.NET MVC 2:ビューとコントローラでテストするもの

私は助けが必要です。痛い週末だった。私はMVC contribを使用してコントローラのテストを行う方法に関する良い記事を探しています。誰も私にはまともな答えがありません。ビューとコントローラで何をテストする必要があるかを知りたいですか?このユニットテストまたは統合テストですか?

私の基本的なシナリオを説明しましょう:インデックスビューにグリッドがあります。このグリッドにはニュース項目のリストがあります。このグリッドでは、各行の最後の列には、EditNewsビューに移動して選択したニュース項目を編集するための編集リンクがあります。また、このIndexビューにはAddNewボタンがあり、CreateNewsビューを表示します。

現在のシナリオでは、どのテストを書く必要がありますか?あなたはユニットテストか統合テストかを明記してください。編集リンクのテストを書く必要がありますか?私はAdd Newsボタンのテストを書く必要がありますか?ユーザーがこのインデックスページで許可されているかどうかを確認するテストを作成する必要がありますか?これは私が現在持っているものです。

[Test] 
public void Index_Should_Redirect_To_Error_View_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Log_Exception_When_User_Does_Not_Have_Permission() 
{ 
} 

[Test] 
public void Index_Should_Return_Default_View() 
{ 
    // Act 
    var result = newsController.Index(); 

    // Assert 
    result 
     .AssertViewRendered() 
     .ForView("Index"); 
} 

更新日:

public ActionResult Index() 
{ 
    IEnumerable<News> news = newsRepository.FindAll(); 
    return View(news); 
} 

まともな記事やサンプルコードをいただければ幸い: はここに私のインデックスのアクションメソッドです。 MVC contribでも、コードサンプルは多用されていません。私は可能な限り多くの意見を聞きたい。

ありがとうございました。

答えて

1

ユニットテスト、統合テスト、ウェブテストの区別が必要です。単体テストは、コントローラアクションを単独で実行するなど、コードのさまざまなコンポーネントをテストするためのテストです。統合テストは、データベースとデータベースからデータを読み書きするリポジトリなどのコードと外部コンポーネントの統合をテストするためのもので、ユーザーがアドレスバーにいくつかのアドレスを入力するなど、アプリケーションのユーザーシナリオ全体をテストするものですいくつかのボタンをクリックしてください。

MVCContrib.TestHelperとRhino Mocksは単体テストを簡素化することを目的としています。だからあなたのシナリオでは、あなたのIndexコントローラーアクションをテストする必要があります。このコントローラーアクションに含まれるコードを表示せずに、正確に何をテストする必要があるのか​​を言うことは難しいです。一般に、コントローラーアクションでユニットテストできるのは、入力を検証し、リポジトリー上の適切なメソッドを呼び出し、結果に応じて適切なビューを戻すことです。

public class HomeController: Controller 
{ 
    private readony INewRepository _repository; 
    public HomeController(INewRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index() 
    { 
     var news = _repository.GetNews(); 
     return View(news); 
    } 
} 

と、対応するユニットテスト:限り、あなたの意見はあなたが必要となります懸念しているよう

[TestClass] 
public class HomeControllerTests : TestControllerBuilder 
{ 
    private HomeController _sut; 
    private INewsRepository _repositoryStub; 

    [TestInitialize()] 
    public void MyTestInitialize() 
    { 
     _repositoryStub = MockRepository.GenerateStub<INewsRepository>(); 
     _sut = new UsersController(_repositoryStub); 
     InitializeController(_sut); 
    } 

    [TestMethod] 
    public void UsersController_Index_Should_Fetch_News_From_Repository() 
    { 
     // arrange 
     var news = new News[0]; 
     _repositoryStub.Stub(x => x.GetNews()).Return(news); 

     // act 
     var actual = _sut.Index(); 

     // assert 
     actual 
      .AssertViewRendered() 
      .WithViewData<News[]>() 
      .ShouldBe(news); 
    } 
} 

それでは、あなたがテストに喜んで、次のindexアクションを持っていると仮定してみましょうWebテストを作成して、期待通りに動作することを確認します。 Seleniumのようなここで役立つツールや、Visual Studioの究極のバージョンをお持ちの場合はWeb Testsを直接使用してください。あなたが見ているかもしれないビューをテストするためのSteven Sandersonのproposed an interesting approach

+0

更新された記事を参照してください。私はまだこの周りに私の頭を得ていない。私が上で述べたテストは、それまでのラインのそれですか?単体テストと統合テストの他に何がありますか?あなたがいくつかのサンプルを提供できるなら、私はこれを感謝します。 –

+0

@Brendanの場合、コントローラの 'Index'アクションは単体テストでなければなりません。これについては、私のコードサンプルを参照してください。それは私があなたに示したものと非常によく似ています。 –

+0

ありがとうございます。ちょっと別の初心者の質問ですが、1回のテストでそれほど多くはありませんか?正しいビューがレンダリングされ、リポジトリ呼び出しを行っているかどうかを確認しますか?これらは2つの別々のテストではいけませんか?また、GetNewsが呼び出されたことをいつ確認しますか?この同じテストで?または別に? –

関連する問題