簡體   English   中英

是否應該測試/模擬包含LINQ表達式的方法?

[英]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 } ) );
}
  1. 安排:設置SUT,以便內部somecollection包含一些已知對象 - 例如Add(dog); 加入(貓); 等等
  2. Act:使用條件調用Find方法
  3. 斷言: Assert.That( results.Is.EquivalentTo(expected_results)

您可以嘗試使用幾個查詢表達式來確保Find方法將其用作Where子句。 應該這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM