[英]Should methods containing LINQ expressions be tested / mocked?
假設我有一個類,其中一個方法將System.Linq.Expressions.Expression作為參數,單元測試中有多少值呢?
public void IList<T> Find(Expression expression)
{
return someCollection.Where(expression).ToList();
}
單元測試或嘲笑這些方法對我來說是一種令人費解的經歷,現在我不得不懷疑它是否都是不值得的。
我如何使用一些任意表達式對此方法進行單元測試
List<Animal> = myAnimalRepository.Find(x => x.Species == "Cat");
由於每個LINQ提供程序都是特定於實現的,因此對它進行單元測試有點人為。 您可以在測試中使用各種不同的方法,它根本不會告訴您有關實際實現的任何信息。 例如,如果它是通過LINQ-to-Objects模擬的,我可以使用:
List<Animal> = myAnimalRepository.Find(x => CheckSpecies(x, "Cat"));
...
static bool CheckSpecies(Animal animal, string species) {
return animal.Species == species;
}
這將適用於LINQ-to-Objects ...但僅適用於LINQ-to-Objects。 同樣,UDF用法(或SQL輔助方法之一)將在LINQ-to-SQL中工作,但不能在Entity Framework中工作。
我得出結論,只有集成測試對這種情況有用,所以沒有; 嘲笑在這里不是很有幫助。 它會給你一種溫暖的快樂感覺,你已經做了一些有用的事情,但最終它沒有測試你在你的應用程序中寫的內容是否有效。
一個更好的方法,IMO,不是通過您的存儲庫接口公開這樣的。 如果將LINQ查詢限制為數據層,則可以消除風險,現在您正在測試(/模擬)純粹的可預測接口。
為什么不? - 它是SUT公共接口的一部分。
這看起來也很容易測試。 除非絕對必要,否則我通常不會使用嘲笑。 我寫的測試就像
[Test]
public void Find()
{
var animalRepository = new AnimalRepository();
animalRepository.Add( dog ); // create a object to species = dog and other relevant attr
animalRespository.Add( cat ); // etc. etc..
var results = animalRepository.Find( a => a.Species == "Cat");
Assert.That( results.Is.EquivalentTo( new List<Animal> { cat } ) );
}
Assert.That( results.Is.EquivalentTo(expected_results)
您可以嘗試使用幾個查詢表達式來確保Find方法將其用作Where子句。 應該這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.