不是最好的標題,所以讓我舉個例子
我有一個將物件串列轉換為另一種型別的方法。說我有以下課程
class Person {
string Name {get;set;}
int Age {get;set;}
string Uuid {get;set;}
}
class OtherPerson {
string FirstName {get;set;}
string LastName {get;set;}
DateTime DateOfBirth {get;set;}
Guid Guid {get;set;}
}
我的方法將 a 轉換List<OtherPerson>為 a List<Person>。我想寫一個斷言,對于輸入中的每個元素,輸出都包含一個匹配通用等效測驗的元素。例如
[Test]
public void MyTest(){
var person1 = GenerateOtherPerson();
List<Person> result = _classUnderTest.ConverToPerson(new[]{person1}.ToList());
//This is what I'm looking for
Assert.That(result, Contains.Item.Matching(p => AreEquivalent(p, person1)));
}
public bool AreEquivalent(Person p1, OtherPerson p2) {
return p1.Name == $"{p2.FirstName} {p2.LastName}"
&& p1.Age == DateTime.Now.Year - p2.DateOfBirth.Year
&& p1.Uuid == p2.Guid.ToString();
}
請注意,這是一個僅查找 1 個元素的簡單示例,但您可以輕松想象對此的擴展,其中我有多個OtherPersons 并且我想斷言該方法的結果恰好包含與每個輸入匹配的 1 個元素。
我無法為此找到慣用的斷言。我能想到的最好的是
matches = result.Select(p => AreEquivalent(p, person1));
Assert.That(matches, Contains.Item(true));
但我不喜歡那樣。我通常喜歡撰寫直接對我的方法的結果進行操作的斷言,而不是撰寫將結果轉換為某種其他形式并對其進行斷言的代碼。
我正在尋找的可能嗎?
uj5u.com熱心網友回復:
嘗試這個...
Assert.That(result, Has.Some.Matches(new Predicate<Person>(p => { return AreEquivalent(p, person1); }));
或者如果您更喜歡使用Has.Exactly(1).Matches(...,它將遍歷整個串列以確保沒有其他匹配項。
這實際上是為了作業(并且在我第一次撰寫它時確實作業)但不再作業,可能是由于已添加的多載......
Assert.That(result, Has.Some.Matches(p => AreEquivalent(p, person1)));
new沒有,return和大括號,我無法編譯它。:-( 也許您可以找到更好的語法。
順便說一句,這是 PredicateConstraint,您可以在 NUnit 源代碼中找到它,但遺憾的是在檔案中找不到。在 NUnit 自己的測驗中甚至有一個測驗。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/535925.html
標籤:C#。网单元测试单位
