我試圖寫該方法的單元測試:如何驗證模擬對象是否從模擬列表中刪除?
public void AddItem(Cart cart, Item item)
{
var duplicates = cart.Items.OfType<Item>()
.Where(i => i.Key == item.Key)
.ToList();
foreach (var duplicate in duplicates)
{
cart.Items.Remove(duplicate);
}
cart.Items.Add(item);
}
我想驗證重複的項目(使用相同的密鑰項目)從列表中刪除添加了新的人之前。此測試失敗:
[TestMethod]
public void AddItemRemovesDuplicateItemsFirst()
{
const int itemKey = 123;
var cart = new Mock<Cart>();
var duplicate = new Mock<Item>();
duplicate.SetupGet(m => m.Key).Returns(itemKey);
cart.SetupGet(m => m.Items).Returns(new List<Item>
{
duplicate.Object
});
var addItem = new Mock<Item>();
addItem.SetupGet(m => m.Key).Returns(itemKey);
var task = GetTask();
task.AddItem(cart.Object, addItem.Object);
Assert.AreEqual(1, cart.Object.Items.Count);
}
它失敗,因爲Count
是2.在另一方面,該測試通過:
[TestMethod]
public void AddItemRemovesDuplicateItemsFirst()
{
const int itemKey = 123;
var cart = new Mock<Cart>();
cart.SetupGet(m => m.Items).Returns(new List<Item>
{
new Item
{
Key = itemKey
}
});
var addItem = new Mock<Item>();
addItem.SetupGet(m => m.Key).Returns(itemKey);
var task = GetTask();
task.AddItem(cart.Object, addItem.Object);
Assert.AreEqual(1, cart.Object.Items.Count);
}
唯一的差別是第二個不使用Mock
對象爲項目清單。
我試圖避免在第二種方法中實際創建對象。我怎麼能第一個通過?
爲什麼你想嘲笑這些物品?我沒有看到你孤立任何行爲,只是一個int的值,你可以在實例化的對象上做這些。 此外,有可能是我不明白的東西,但是你可以簡單地不重複的項目添加到列表而不是刪除和讀取?它會使您的方法中的代碼更簡單。 – clhereistian