代码之家  ›  专栏  ›  技术社区  ›  Phil.Wheeler

是否应该测试/模拟包含LINQ表达式的方法?

  •  4
  • Phil.Wheeler  · 技术社区  · 16 年前

    假设我有一个类,它的方法以System.Linq.Expressions.Expression作为参数,那么在单元测试中有多少值呢?

    public void IList<T> Find(Expression expression)
    {
        return someCollection.Where(expression).ToList();
    }
    

    对我来说,单元测试或嘲弄这些方法是一次让人心烦意乱的经历,我现在不得不怀疑这一切是否都是不值得的。

    如何使用任意表达式(如

    List<Animal> = myAnimalRepository.Find(x => x.Species == "Cat");
    
    2 回复  |  直到 16 年前
        1
  •  6
  •   Marc Gravell    16 年前

    关于真正的实现。例如,如果通过LINQ对对象进行模拟,我可以使用:

    List<Animal> = myAnimalRepository.Find(x => CheckSpecies(x, "Cat"));
    ...
    static bool CheckSpecies(Animal animal, string species) {
        return animal.Species == species;
    }
    

    这将与LINQ to对象一起工作。。。但是 只有

    我得出的结论是只有集成测试对这个场景有用,所以没有;嘲笑 很有帮助。它会给你一种温暖快乐的感觉,你做了一些有用的事情,但最终它并不能测试你在应用程序中写的东西是否有效。

    more here .

        2
  •  2
  •   Gishu    16 年前

    它是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);添加(cat);等。
    2. 操作:使用条件调用Find方法
    3. Assert.That( results.Is.EquivalentTo(expected_results)

    您可以尝试几个查询表达式,以确保Find方法将其用作Where子句。应该可以了。