代码之家  ›  专栏  ›  技术社区  ›  Jamie Dixon

如何模拟IEnumerable<T>,以便测试接收它的方法

  •  15
  • Jamie Dixon  · 技术社区  · 16 年前

    IEnumerable<T> 作为一个参数。

    我现在正在嘲笑 IEnumerable<T>

     var mockParent = new Mock<ICsvTreeGridExportable>();
     var mockChild = new Mock<ICsvTreeGridExportable>();
    

    它如何将这些模拟对象放入 IEnumerable<T> 这样我就可以把它们作为参数传递给我想要测试的方法了?

    IEnumerable<ICsvTreeGridExportable>

    5 回复  |  直到 16 年前
        1
  •  20
  •   Noldorin    16 年前

    我将使用collection intialiser语法创建一个数组。即

    var mockParent = new Mock<ICsvTreeGridExportable>();
    var mockChild = new Mock<ICsvTreeGridExportable>();
    
    TestMethod(new[] { mockParent.Object, mockChild.Object });
    

    NET中的数组实现 IEnumerable<T> 界面,所以你们都准备好了。

    IEnumerable<T>

    TestMethod((new[] { mockParent.Object, mockChild.Object }).TakeWhile(true));
    
        2
  •  6
  •   LukeH    16 年前

    您可以创建一个数组(数组实现 IEnumerable<T>

    var mockEnumerable = new[] { mockParent.Object, mockChild.Object };
    

    IEnumerable<T> 无法转换回数组等,然后可以使用帮助器方法创建它:

    var mockEnumerable = CreateEnumerable(mockParent.Object, mockChild.Object);
    
    // ...
    
    public static IEnumerable<T> CreateEnumerable<T>(params T[] items)
    {
        foreach (T item in items)
        {
            yield return item;
        }
    }
    

    (正如Jamie在评论中提到的,您需要使用 嘲弄 对象,而不是 Mock 物体。例如 mockParent.Object , mockChild.Object 只是 mockParent mockChild .)

        3
  •  1
  •   sebagomez    16 年前


    创建一个虚拟函数

    private IEnumerable<ICsvTreeGridExportable> Dummy()
    {
         yield return new ICsvTreeGridExportable();
    }
    

    在测试函数中,执行以下操作

    private void TestFunction()
    {
       ThisIsTheOneThatNeedsIenumerable(Dummy());
    }
    

        4
  •  0
  •   Josh Pearce    16 年前
    List<ICsvTreeGridExportable> myList = new List<ICsvTreeGridExportable>();
    myList.Add(mockParent);
    myList.Add(mockChild);
    return myList;
    
        5
  •  0
  •   Dan Tao    16 年前

    这里有一个替代sebastian答案的选项,允许您指定需要多少个任意类型的假人:

    private IEnumerable<T> GetDummies<T>(int numDummies) where T : new() {
        for (int i = 0; i < numDummies; i++) yield return new T();
        yield break;
    }
    

    private IEnumerable<T> GetDummies<T>(Func<T> generator, int numDummies) {
        for (int i = 0; i < numDummies; i++) yield return generator.Invoke();
        yield break;
    }