2016-08-09 40 views
1

我必須將MS單元測試轉換爲NUnit並且遇到此斷言。斷言集合中的所有項目都具有使用NUnit的其中一個項目屬性的值

Assert.AreEqual(collection.Select(item => item.location.id).Distinct().Count(), 1); 

我希望有一個優雅的方式來寫約束,但我一直沒能找到一個。我的解決辦法是這樣的,但我不是與它高興:

Expect(collection.Select(item => item.location.id).Distinct().Count(), Is.EqualTo(1)); 

是否有書面聲明,其中的意圖更清晰可讀的更好的辦法? (使用Has.Map(collection).


編輯2:

我才意識到它可能有助於清楚地陳述的意圖是什麼:

集合中的所有項具有相同的位置ID(不知道該ID是什麼)


E DIT 1:

這是集合可能是什麼樣子的JSON:

[{itemId=1, location={name="A", id=1}}, 
{itemId=2, location={name="A", id=1}}, 
{itemId=3, location={name="A", id=1}}] 

distinct.count = 1           =>通過

[{itemId=1, location={name="A", id=1}}, 
{itemId=2, location={name="A", id=1}}, 
{itemId=4, location={name="B", id=2}}] 

distinct.count = 2           =>失敗

編輯3:我的最終解決方案的基礎上,法比奧的回答

IEnumerable<long?> locationIds = collection.Select(item => item.location.id); 
Expect(locationIds, Has.All.EqualTo(locationIds.FirstOrDefault())); 
+0

您期待所有項目都是唯一的嗎?你能舉一個集合可能是什麼樣子的例子嗎? –

+0

我試圖理解這個斷言的價值,調用.Distinct會自動去除所有重複對象,你的結果將永遠等於1. –

+0

@MoeGhafari好點。事實上唯一的辦法是失敗的是,如果列表是空的,條件將始終成立。 –

回答

2

可讀的版本

int expectedCount = 1; 
int actualCount = collection.Select(item => item.location.id) 
          .Distinct() 
          .Count() 

Assert.AreEqual(expectedCount, actualCount); 

我不知道,但你可以試試這個版本,其中那句「是人人平等...「必須幫助」非程序員「,並且您的代碼可以擺脫」魔法「號碼

var value = collection.Select(item => item.location.id).FirstOrDefault(); 
Assert.That(collection.Select(item => item.location.id), Is.All.EqualTo(value)); 
+0

遺憾,但對我來說,是不是好點;我希望能夠使用NUnit約束API,而不僅僅是重新設置lambda表達式的格式,我想要一個非程序員可以閱讀和理解的東西 – Holly

+0

似乎上面是最簡單的。請參閱Mark Seeman的回答http://stackoverflow.com/a/32936435/1134076 –

+0

@Holly,Is.All.EqualTo是另一種聲明集合包含具有相同'location.id'的項目的方法。有'Has.Exact'約束可以用於不同值的計數 – Fabio

0

如果我知道你想要做的......這應該去做什麼......

Assert.That(collection.Select(() => item.location.id), Is.Unique); 

離開這裏這個錯誤的答案......有人可能要測試的獨特性,但是這不是什麼這傢伙想要!

+0

哦,等一下!我沒有明白。你想要獨特的相反。 :-) – Charlie

+0

這實際上是流利的語法上的差距,雖然這不是任何人多年來所要求的,所以可能不是什麼大不了的。隨意請求一項功能。 – Charlie

+0

我也需要這個功能。 Is.All.Not.Unique錯了嗎? – wishmaster35

相關問題