DbSet模拟,没有结果,而其次调用了ToList [英] DbSet mock, no results while calling ToList secondly

查看:688
本文介绍了DbSet模拟,没有结果,而其次调用了ToList的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图嘲弄的DbContext和DbSet。这适用于我以前的单元测试,但而我的代码是呼吁DbSet第二次了ToList方法时发生问题。



首先dbSet.ToList()返回嘲笑的结果。
第二个返回0元素;

  VAR queryableData =新的List<串> {A,B ,C} .AsQueryable(); 

变种mockDbSet =新的模拟< D​​bSet<串GT;>();
变种Q = mockDbSet.As<&IQueryable的LT;串GT;>();
q.Setup(M = GT; m.Provider).Returns(queryableData.Provider);
q.Setup(M = GT; m.Expression).Returns(queryableData.Expression);
q.Setup(M = GT; m.ElementType).Returns(queryableData.ElementType);
q.Setup(M = GT; m.GetEnumerator())返回(queryableData.GetEnumerator());

DbSet<串GT; dbset = mockDbSet.Object;
&IQueryable的LT;字符串>查询= dbset;

//结果:ABC
变种A1 = dbset.ToList();
的foreach(在A1 VAR一)
Console.Write(一);

//没有结果
VAR A2 = dbset.ToList();
的foreach(在A2变种一个)
Console.Write(一);


解决方案

您在每次调用返回同样的枚举实例的GetEnumerator 。当它枚举一次,它完成,EF不会调用其重置方法,而是要求一个新的枚举。



但你返回刚刚取得了所有的元素和产量没有更多的人。



相反,返回函数返回的枚举,将每次你问它时返回一个新的枚举。

  q.Setup(M = GT ; m.GetEnumerator())返回(()=> queryableData.GetEnumerator()); 


I'm trying to mock DbContext and DbSet. This works for my previous unit tests, but problem occurs while my code was calling ToList method on DbSet second time.

First dbSet.ToList() returns mocked results. Second one returns 0 elements;

       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);

解决方案

You return the very same enumerator instance upon each call to GetEnumerator. When it enumerates once, it is done, EF doesn't call its Reset method, rather it asks for a new enumerator.

But you return the one that just has yielded all elements and yields no more.

Instead, return a function that returns the enumerator, that will return a new enumerator each time you ask for it.

 q.Setup(m => m.GetEnumerator()).Returns( () => queryableData.GetEnumerator() );

这篇关于DbSet模拟,没有结果,而其次调用了ToList的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆