c# – 如何单元测试使用Entity Framework的存储库模式?

c# – 如何单元测试使用Entity Framework的存储库模式?,第1张

概述我正在尝试单元测试通过实体框架进行的存储库: 我想要发生的是测试存储库而不实际发送/连接到实际的数据库,我想这样做,而不使用任何嘲笑的框架. 目前我的测试是将数据发送到数据库,我想要发生的是测试add / remove等方法,而不会将实际数据发送到数据库,因为它仅用于测试. 这是存储库: namespace AbstractFactory.Repository{ using System 我正在尝试单元测试通过实体框架进行的存储库:

我想要发生的是测试存储库而不实际发送/连接到实际的数据库,我想这样做,而不使用任何嘲笑的框架.

目前我的测试是将数据发送到数据库,我想要发生的是测试add / remove等方法,而不会将实际数据发送到数据库,因为它仅用于测试.

这是存储库:

namespace AbstractFactory.Repository{    using System.Collections.Generic;    using System.Data.Entity;    using System.linq;    /// <summary>    /// This class serves as the structure of the Author repository using a database    /// </summary>    public class DbAuthorRepository : IRepository<AuthorEntity>    {        private AbstractFactoryPatternEntitIEs context;        public DbAuthorRepository(AbstractFactoryPatternEntitIEs context)        {            this.context = context;        }        /// <summary>        /// Adds the specifIEd author.        /// </summary>        /// <param name="author">The author.</param>        public voID Add(AuthorEntity author)        {            context.AuthorEntitIEs.Add(author);        }        /// <summary>        /// Removes the specifIEd author.        /// </summary>        /// <param name="author">The author.</param>        public voID Remove(AuthorEntity author)        {            this.context.AuthorEntitIEs.Remove(author);        }        /// <summary>        /// Saves this instance.        /// </summary>        public voID Save()        {            this.context.SaveChanges();        }        /// <summary>        /// Gets all.        /// </summary>        /// <returns>returns a List of all the authors</returns>        public IEnumerable<AuthorEntity> GetAll()        {            List<AuthorEntity> result = this.context.AuthorEntitIEs.Include(a => a.Books).ToList();            return result;        }        /// <summary>        /// Gets the author by ID.        /// </summary>        /// <param name="ID">The ID.</param>        /// <returns>returns an entity</returns>        public AuthorEntity GetByID(int ID)        {            AuthorEntity result = this.context.AuthorEntitIEs.Single(a => a.AuthorID == ID);            return result;        }    }}

以下是单元测试的当前代码:

[TestMethod]        public voID Add_MethodisCalled_EntityCountIsIncrementedByOne()        {            using (ShimsContext.Create())            {                ShimAbstractFactoryPatternEntitIEs context = new ShimAbstractFactoryPatternEntitIEs(new AbstractFactoryPatternEntitIEs());                DbAuthorRepository repository = new DbAuthorRepository(context);                repository.Add(new AuthorEntity { Firstname = "Test",Lastname = "testing=" });                var actual = repository.GetAll().Count();                repository.Save();                var expected = repository.GetAll().Count();                Assert.AreNotEqual(actual,expected);            }            //AbstractFactoryPatternEntitIEs context = new AbstractFactoryPatternEntitIEs();            //DbAuthorRepository repository = new DbAuthorRepository(context);            //var actual = repository.GetAll().Count();            //repository.Add(new AuthorEntity { Firstname = "Testing",Lastname = "MyTest" });            //repository.Save();            //var expected = repository.GetAll().Count();            //Assert.AreNotEqual(actual,expected);        }        [TestMethod]        public voID Remove_MethodisCalled_EntityCountRemainsTheSame()        {            AbstractFactoryPatternEntitIEs context = new AbstractFactoryPatternEntitIEs();            DbAuthorRepository repository = new DbAuthorRepository(context);            AuthorEntity newAuthor = new AuthorEntity { Firstname = "Testing",Lastname = "MyTest" };            repository.Add(newAuthor);            repository.Save();            var actual = repository.GetAll().Count();            Console.Writeline(actual);            repository.Remove(newAuthor);            var expected = repository.GetAll().Count();            Console.Writeline(expected);            Assert.AreEqual(actual,expected);        }        [TestMethod]        public voID Get_MethodisCalled_CorrectAuthorIsRetrIEved()        {            AbstractFactoryPatternEntitIEs context = new AbstractFactoryPatternEntitIEs();            DbAuthorRepository repository = new DbAuthorRepository(context);            int target = 4;            AuthorEntity author = repository.GetByID(target);            Assert.AreEqual(target,author.AuthorID);        }

我想使用垫片/存根/假货来进行测试.

解决方法 实体框架存储库是您的存储库接口的具体实现.因为它是具体的,你不能抽象和测试没有数据库 – 这一具体实现的全部要写数据到数据库!

这意味着,测试EF存储库应该是旨在验证存储库写入实际数据库 – 在您调用存储库方法的测试的行为阶段,在断言阶段,您可以使用从数据库获取数据的任何其他方式(ado.net也许?)来检查存储库是否完成其工作.

另一个无关紧要的是,您可以使用存储库的另一个实现,该存储库使用内存中的数据存储,并将这些内存中的存储库注入到其他服务中,可以在不写入物理数据库的情况下测试这些服务.您甚至可以模拟一个注册到其他服务的存储库,只是为了执行一些行为测试,即测试您的服务是否正确使用您的存储库.

总结

以上是内存溢出为你收集整理的c# – 如何单元测试使用Entity Framework的存储库模式?全部内容,希望文章能够帮你解决c# – 如何单元测试使用Entity Framework的存储库模式?所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存