c# - 在此示例中,Microsoft是否有权在每个测试中执行多个断言?

标签 c# unit-testing

最近,我一直在尝试改善单元测试,而真正让我感到困惑的UT的“规则”之一是“每个测试一个断言”。

我很想知道人们是否认为MS在声明此测试方面做得正确(忽略模拟的缺乏等)。根据我目前的理解,该示例实际上应该对每个需要测试的对象属性执行一次创建调用(而不是一次调用和多个断言)。我做这个假设正确吗?

方法取自: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);
}

最佳答案

这个规则经常被误解。这与单个声明无关(如在代码/ Assert调用行中),而是与验证单个概念有关。在这种情况下,Microsoft验证专辑是否已正确添加-专辑在这里是单个概念。

Roy Osherove's put it in very simple words


  我的指导原则通常是每次测试都测试一个逻辑概念。您可以在同一对象上具有多个断言。它们通常是要测试的相同概念。

关于c# - 在此示例中,Microsoft是否有权在每个测试中执行多个断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10104073/

相关文章:

javascript - Jest/ typescript : Mock class dependencies in Jest and Typescript

unit-testing - 是否可以使用 Pit Mutation Test 提取每种测试方法的突变测试结果

c# - 如何从 List<IEnumerable<ItemClass>> 到 IEnumerable<ItemClass> 进行选择?

c# - 解析一个大的 CSV 文件 C# .net 4

c# - 正确的 MVVM ViewModel 和模型模式

c# - 如何移动数组中的项目?

node.js - nodejs/mocha/nock - 模拟整个 html 响应

c# - 如何通过 WCF 传递 System.Drawing.Rectangle?

Django 测试转储数据/结果

c# - 使用Moq进行测试,一行使用异步可查询扩展和项目,如何测试