在这个单元测试中检查这么多东西有什么问题吗?:
ActualModel = ActualResult.AssertViewRendered() // check 1
.ForView("Index") // check 2
.WithViewData<List<Page>>(); // check 3
CollectionAssert.AreEqual(Expected, ActualModel); // check 4
Run Code Online (Sandbox Code Playgroud)
此测试的主要目标是验证返回正确的视图(检查2)并且它包含正确的数据(检查4).
我可以通过将其分成多个测试来获得任何收益吗?我一切都是为了做正确的事情,但如果它没有实际价值我就不会分手了.
我对单元测试很陌生,所以请保持温和.
这是我第一次尝试进行单元测试,所以请耐心等待.
我仍在尝试对将POCO列表转换为ADO.Recordsets的库进行单元测试.
现在,我正在尝试编写一个创建a的测试List<Poco>,将其转换为Recordset(使用我想测试的方法),然后检查它们是否包含相同的信息(如,Poco.Foo == RS.Foo等等......) .
这是POCO:
public class TestPoco
{
public string StringValue { get; set; }
public int Int32Value { get; set; }
public bool BoolValue { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
...到目前为止这是测试(我正在使用xUnit.net):
[Fact]
public void TheTest()
{
var input = new List<TestPoco>();
input.Add(new TestPoco { BoolValue = true, Int32Value = 1, StringValue = "foo" });
var actual = input.ToRecordset();
Assert.Equal(actual.BoolValue, true);
Assert.Equal(actual.Int32Value, 1);
Assert.Equal(actual.StringValue, "foo");
}
Run Code Online (Sandbox Code Playgroud)
我不喜欢这个是最后的三个断言,POCO的每个属性一个.
我已多次读过一次测试中的多个断言是邪恶的(我理解其中的原因,我同意).
问题是,我该怎样摆脱它们?
我有Roy Osherove的优秀着作"单位测试的艺术"就在我的面前,他有一个例子,它涵盖了这一点 …
最近我一直在努力改进我的单元测试,并且真正让我感到困惑的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);
} …Run Code Online (Sandbox Code Playgroud)