Phi*_*ler 4 c# unit-testing mocking linq-expressions
假设我有一个类,其中一个方法将System.Linq.Expressions.Expression作为参数,单元测试中有多少值呢?
public void IList<T> Find(Expression expression)
{
return someCollection.Where(expression).ToList();
}
Run Code Online (Sandbox Code Playgroud)
单元测试或嘲笑这些方法对我来说是一种令人费解的经历,现在我不得不怀疑它是否只是不值得.
我如何使用一些任意表达式对此方法进行单元测试
List<Animal> = myAnimalRepository.Find(x => x.Species == "Cat");
Run Code Online (Sandbox Code Playgroud)
由于每个LINQ提供程序都是特定于实现的,因此对它进行单元测试有点人为.您可以在测试中使用各种不同的方法,它根本不会告诉您有关实际实现的任何信息.例如,如果它是通过LINQ-to-Objects模拟的,我可以使用:
List<Animal> = myAnimalRepository.Find(x => CheckSpecies(x, "Cat"));
...
static bool CheckSpecies(Animal animal, string species) {
return animal.Species == species;
}
Run Code Online (Sandbox Code Playgroud)
这将适用于LINQ-to-Objects ...但仅适用于LINQ-to-Objects.同样,UDF用法(或SQL辅助方法之一)将在LINQ-to-SQL中工作,但不能在Entity Framework中工作.
我得出结论,只有集成测试对这种情况有用,所以没有; 嘲笑在这里不是很有帮助.它会给你一种温暖的快乐感觉,你已经做了一些有用的事情,但最终它没有测试你在你的应用程序中写的内容是否有效.
一个更好的方法,IMO,不是通过您的存储库接口公开这样的.如果将LINQ查询限制为数据层,则可以消除风险,现在您正在测试(/模拟)纯粹的可预测接口.
| 归档时间: |
|
| 查看次数: |
1643 次 |
| 最近记录: |