我想要发生的是测试存储库而不实际发送/连接到实际的数据库,我想这样做,而不使用任何嘲笑的框架.
目前我的测试是将数据发送到数据库,我想要发生的是测试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的存储库模式?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)