DbSet mock,第二次调用ToList时没有结果

Emi*_*ski 18 .net c# ado.net unit-testing entity-framework

我正在尝试模拟DbContext和DbSet.这适用于我之前的单元测试,但是当我的代码第二次在DbSet上调用ToList方法时出现问题.

首先,dbSet.ToList()返回模拟结果.第二个返回0个元素;

       var queryableData = new List<string>{ "a", "b", "c" }.AsQueryable();

        var mockDbSet = new Mock<DbSet<string>>();
        var q = mockDbSet.As<IQueryable<string>>();
        q.Setup(m => m.Provider).Returns(queryableData.Provider);
        q.Setup(m => m.Expression).Returns(queryableData.Expression);
        q.Setup(m => m.ElementType).Returns(queryableData.ElementType);
        q.Setup(m => m.GetEnumerator()).Returns(queryableData.GetEnumerator());

        DbSet<string> dbset = mockDbSet.Object;
        IQueryable<string> query = dbset;

        //RESULTS: abc
        var a1 = dbset.ToList();
        foreach (var a in a1)
            Console.Write(a);

        //NO RESULTS
        var a2 = dbset.ToList();
        foreach (var a in a2)
            Console.Write(a);
Run Code Online (Sandbox Code Playgroud)

Wik*_*hla 39

每次调用时都返回相同的枚举器实例GetEnumerator.当它枚举一次,它完成后,EF不会调用它的Reset方法,而是要求一个新的枚举器.

但是你返回的只是已经产生了所有元素并且不再产生的那个.

相反,返回一个返回枚举器的函数,每次请求它时都会返回一个新的枚举器.

 q.Setup(m => m.GetEnumerator()).Returns( () => queryableData.GetEnumerator() );
Run Code Online (Sandbox Code Playgroud)