2012-04-11 8 views
1

最近、単体テストを改善しようとしています。本当に私を混乱させるUTの「ルール」の1つは、「テストごとに1つのアサート」です。この例では、テストごとに複数のアサーションを実行する権利はありますか?

私は、MSがこのテストを主張することに関して正しいことをしていると人々が考えているかどうかを知りたいと考えています(モックの欠如などを無視してください)。私の現在の理解に基づいて、この例では実際に(1回の呼び出しと複数のアサートではなく)テストする必要があるオブジェクトプロパティごとに1回の作成呼び出しを実行する必要があります。私はこの前提を正していますか?取ら

方法:バージョンではhttp://msdn.microsoft.com/en-us/vs2010trainingcourse_aspnetmvc3testing_topic4

[TestMethod()] 
    [DeploymentItem("MvcMusicStore.mdf")] 
    [DeploymentItem("MvcMusicStore_log.ldf")] 
    public void CreateTest() 
    { 
      using (TransactionScope ts = new TransactionScope()) 
      { 
       StoreManagerController target = new StoreManagerController(); 
       Album album = new Album() 
       { 
        GenreId = 1, 
        ArtistId = 1, 
        Title = "New Album", 
        Price = 10, 
        AlbumArtUrl = "/Content/Images/placeholder.gif" 
       }; 
       ActionResult actual; 
       actual = target.Create(album); 
       Assert.IsTrue(album.AlbumId != 0); 
       MusicStoreEntities storeDB = new MusicStoreEntities(); 
       var newAlbum = storeDB.Albums.SingleOrDefault(a => a.AlbumId == album.AlbumId); 
       Assert.AreEqual(album.GenreId, newAlbum.GenreId); 
       Assert.AreEqual(album.ArtistId, newAlbum.ArtistId); 
       Assert.AreEqual(album.Title, newAlbum.Title); 
       Assert.AreEqual(album.Price, newAlbum.Price); 
       Assert.AreEqual(album.AlbumArtUrl, newAlbum.AlbumArtUrl); 
      } 
    } 

は最もαで、難しいルールではありません

[TestMethod()] 
    public void CreateTest_AlbumUrl() 
    { 
     // ** Arrange 
     var storeDB = new Mock<MusicStoreEntities>() 

     // Some code to setup the mocked store would go here 

     StoreManagerController target = new StoreManagerController(storeDB); 
     Album album = new Album() 
      { 
      GenreId = 1, 
      ArtistId = 1, 
      Title = "New Album", 
      Price = 10, 
      AlbumArtUrl = "/Content/Images/placeholder.gif" 
      }; 

     // ** Act 
     actual = target.Create(album);      
     var newAlbum = storeDB.Albums.SingleOrDefault(a => a.AlbumId == album.AlbumId); 

     // ** Assert 
     Assert.AreEqual(album.AlbumArtUrl, newAlbum.AlbumArtUrl); 
} 
+0

各テストケースが1つのアサートしか持たないというアイデアは、愚かです(http://stackoverflow.com/a/20300843/545127)。 – Raedwald

答えて

6

このルールはあまりにもしばしば誤解されています。単一のアサーション(コード行/Assert呼び出しのように)ではなく、単一のコンセプトを検証することです。この場合、Microsoftはアルバムが正しく追加されたことを確認します。アルバムはここでは単一の概念です。

Roy Osherove's put it in very simple words

私のガイドラインは、テストごとに論理的な概念をテストすることが通常です。同じオブジェクトに対して複数のアサートを行うことができます。彼らは通常、テストされているのと同じコンセプトになります。

+0

ありがとう、私は、私が読んでいる記事のいくつかよりもはるかに明確であると思います。 – user460667

2

(アルバムオブジェクトの各プロパティについて複製)のようなものになるだろう経験則IMHO多くの場合、単一のテストに複数のアサートを入れる方が簡単で簡単です。

各テストで1つのストーリー/ケースをテストする必要がありますが、検証するには複数のアサートが必要です。 IMHO「ルール」を満たすためにのみ、ほぼ同一の複数のテストを作成するのは難題です。しかし、これは私の個人的な意見です。私は規則を守ることよりも実用的であることを好む。

0

テストでは1つの動作のみをアサーションする必要がありますが、1つの動作をアサートするには複数のAssert呼び出しが必要な場合があります。

この場合、テスト中の動作は、アルバムが提供された情報で作成されているようです。

関連する問題