最近,我一直在尝试改善单元测试,而真正让我感到困惑的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/