c# – 使用Mock IDbSet进行单元测试实体框架

c# – 使用Mock IDbSet进行单元测试实体框架,第1张

概述我从来没有真正做过单元测试,而且我偶然发现了我的第一个测试.问题是_repository.Golfers.Count();始终表示DbSet为空. 我的测试很简单,我只是想添加一个新的高尔夫球手 [TestClass]public class GolferUnitTest //: GolferTestBase{ public MockGolfEntities _repository; 我从来没有真正做过单元测试,而且我偶然发现了我的第一个测试.问题是_repository.Golfers.Count();始终表示DbSet为空.

我的测试很简单,我只是想添加一个新的高尔夫球手

[TestClass]public class GolferUnitTest //: GolferTestBase{    public MockGolfEntitIEs _repository;    [TestMethod]    public voID ShouldAddNewGolferToRepository()    {        _repository = new MockGolfEntitIEs();        _repository.Golfers = new InMemoryDbSet<Golfer>(CreateFakeGolfers());        int count = _repository.Golfers.Count();        _repository.Golfers.Add(_newGolfer);        Assert.IsTrue(_repository.Golfers.Count() == count + 1);    }    private Golfer _newGolfer = new Golfer()    {        Index = 8,GuID = System.GuID.NewGuID(),Firstname = "Jonas",Lastname = "PeRSSon"    };    public static IEnumerable<Golfer> CreateFakeGolfers()    {        yIEld return new Golfer()        {            Index = 1,Firstname = "Bill",Lastname = "Clinton",GuID = System.GuID.NewGuID()        };        yIEld return new Golfer()        {            Index = 2,Firstname = "Lee",Lastname = "Westwood",GuID = System.GuID.NewGuID()        };        yIEld return new Golfer()        {            Index = 3,Firstname = "Justin",Lastname = "Rose",GuID = System.GuID.NewGuID()        };    }

我已经使用实体框架和代码优先建立了一个数据模型.我为IDbSet嘲笑一个派生类,以便测试我的上下文(对于在线的人来说,我完全不记得)

public class InMemoryDbSet<T> : IDbSet<T> where T : class{    Readonly HashSet<T> _set;    Readonly Iqueryable<T> _queryableSet;    public InMemoryDbSet() : this(Enumerable.Empty<T>()) { }    public InMemoryDbSet(IEnumerable<T> entitIEs)    {        _set = new HashSet<T>();        foreach (var entity in entitIEs)        {            _set.Add(entity);        }        _queryableSet = _set.Asqueryable();    }    public T Add(T entity)    {        _set.Add(entity);        return entity;    }    public int Count(T entity)    {        return _set.Count();    }    // bunch of other methods that I don't want to burden you with}

当我调试并逐步通过代码时,我可以看到我实例化了_repository并填充了三个假的高尔夫球手,但是当我退出添加功能时,_respoistory.Golfers再次为空.当我添加一个新的高尔夫球手,_set.Add(实体)运行,并且添加了高尔夫球手,但是再次_respoistory.Golfers是空的.我在这里缺少什么?

更新

我很抱歉成为一个白痴,但是我没有在我的MockGolfEntitIEs上下文中实现该集.我没有的原因是我以前尝试,但无法弄清楚如何,继续,忘记了.那么,如何设置一个IDbSet?这是我试过的,但它给我一个Stack Overflow错误.我觉得像一个白痴,但是我无法弄清楚如何写入set函数.

public class MockGolfEntitIEs : DbContext,IContext{    public MockGolfEntitIEs() {}    public IDbSet<Golfer> Golfers {         get {            return new InMemoryDbSet<Golfer>();        }        set {            this.Golfers = this.Set<Golfer>();        }    }}
解决方法 您不需要实现get / set,以下代码应该足以为您生成上下文.
public class MockGolfEntitIEs : DbContext,IContext{    public MockGolfEntitIEs() {}    public IDbSet<Golfer> Golfers { get; set;}}

我已经实现了您在原始帖子中的代码,并且似乎对我来说,所有内容都可以正常工作 – 您在哪里可以获得InMemoryDbSet的源代码?我在使用NuGet package 1.3,也许你应该尝试那个版本?

总结

以上是内存溢出为你收集整理的c# – 使用Mock IDbSet进行单元测试实体框架全部内容,希望文章能够帮你解决c# – 使用Mock IDbSet进行单元测试实体框架所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1257287.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存