0

私はMVCcontribとRhinoモックでMVC2を使用しています。

私は助けを必要としています。辛い週末でした。私は、MVCcontribを使用してコントローラーでテストを行う方法に関する優れた記事を探しています。そして、誰も私にまともな答えを持っていません。ビューとコントローラーで何をテストする必要があるのか​​知りたいですか?これは単体テストですか、それとも統合テストですか?

基本的なシナリオを説明しましょう。グリッドが表示されたインデックスビューがあります。このグリッドには、ニュースアイテムのリストがあります。このグリッドのすべての行の最後の列には、選択したニュース項目を編集するためにユーザーをEditNewsビューに移動する[編集]リンクがあります。また、このインデックスビューには、ユーザーをCreateNewsビューに移動する[ニュースの追加]ボタンがあります。

現在のシナリオを考えると、どのようなテストを作成する必要がありますか?ユニットテストなのか統合テストなのかを教えてください。編集リンクのテストを作成する必要がありますか?[ニュースの追加]ボタンのテストを作成する必要がありますか?ユーザーがこのインデックスページで許可されているかどうかを確認するためのテストを作成する必要がありますか?これは私が現在持っているものです:

[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では、コードサンプルはあまり役に立ちません。できるだけ多くのご意見を伺いたいと思います。

ありがとう。

4

1 に答える 1

1

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

MVCContrib.TestHelperとRhinoMocksは、単体テストを簡素化することを目的としています。したがって、シナリオでは、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);
    }
}

ビューに関する限り、期待どおりに動作することを確認するためにWebテストを作成する必要があります。ここでは、Seleniumなどのさまざまなツールを使用したり、UltimateバージョンのVisualStudioを使用している場合はWebテストを直接使用したりできます。スティーブンサンダーソンはまた、あなたが見るかもしれないビューをテストするための興味深いアプローチを提案しました。

于 2010-12-05T09:50:57.933 に答える