[英]How to test if two collections of objects are in a different order based on one of the objects' properties?
我對單元測試相當陌生,並且遇到了問題。 我有兩個 collections(甲板)持有物體(卡片),卡片是具有 ID、價值、花色等的物體。
我正在編寫一個單元測試來查看我的 Shuffle() 方法是否有效,所以我想測試一個未洗牌的牌組(創建 52 張 ID 為 0-51 的牌)和洗牌的牌組是否處於相同的順序。 顯然,卡片是唯一的對象,即使它們具有相同的值。 所以根據定義,測試它們是否相同總是會導致錯誤。 我對 NUnit 非常非常陌生(兩天前才安裝它),我仍然在到處糾結於語法。
理想情況下,我想要一個斷言來檢查 collections 的順序是否相同,順序由卡的 ID 確定,因為作為對象,它們都是唯一的,因此總是以不同的順序。 現在,我可以檢查洗牌后的牌組是否不再按 ID 排序,但這將是一個糟糕的單元測試,因為它假定未洗牌的牌組總是按 ID 排序。 我也可以檢查未洗牌的牌組,但在不實際比較兩個牌組的情況下以這種方式進行測試似乎相當不雅。
我還想要一個斷言來檢查我的甲板構造函數是否僅創建唯一 ID,但同樣,集合中的所有對象始終是唯一的,但我不知道用於檢查所有特定屬性的唯一性的語法(如果存在)卡片。
我一直在瘋狂地谷歌搜索,我一直在通過蠻力嘗試很多不同的語法東西,但我現在不知所措。 我希望你們能幫助我,提前謝謝!
您可以將SequnceEqual
與 LINQ Select
一起使用,如下所示:
class Card
{
public int CardId { get; set; }
}
Assert.IsTrue(new[] { new Card {CardId = 1}, new Card {CardId = 2}}
.Select(c => c.CardId)
.SequenceEqual(new[] {1,2}));
另外我建議查看Fluent Assertions庫,有時在那里做事不是很明顯,但總的來說它有一些非常有用的功能。
要使用Id
屬性確定卡片的順序是否相同,您可以簡單地將 select 該屬性放入IEnumerable
中,然后對它們使用System.Linq
擴展方法SequenceEqual
:
// Where 'unshuffled' and 'shuffled' are both 'List<Card>' objects
var areEqual = unshuffled.Select(c => c.Id).SequenceEqual(shuffled.Select(c => c.Id));
或者,您可以覆蓋Card
class 上的Equals
和GetHashCode
,然后將其用於相等比較。 這將有助於其他可能需要的卡片比較:
public class Card : IEquatable<Card>
{
public int Id { get; set; }
public bool Equals(Card other)
{
return Id == other?.Id;
}
public override bool Equals(object obj)
{
return Equals(obj as Card);
}
public override int GetHashCode()
{
return Id;
}
}
現在我們的比較代碼稍微簡單一些:
var areEqual = unshuffled.SequenceEqual(shuffled);
僅使用 NUnit 功能的最簡單方法是
Assert.That(shuffled, Is.Not.EqualTo(unshuffled);
請注意,這假設您已經為卡 object 覆蓋了 Equals。
為什么這有效...
對於一整套測試,我可能想確保套牌大小沒有改變,並且所有元素都是獨一無二的。 就像是...
Assert.That(shuffled, Is.EqualTo(DECK_SIZE);
Assert.That(shuffled, Is.Unique);
Assert.That(shuffled, Is.Not.EqualTo(unshuffled));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.