Asp.net WebApi + EF 单元测试架构 DbContext一站到底
2016-06-14 21:45
513 查看
其实关于webapi和Ef service的单元测试我以前已经写过相关文章,大家可以参考:
Asp.net WebAPI 单元测试
单元测试 mock EF 中DbContext 和DbSet Include
先看一下项目结构图:
View Code
具体使用如下:
api运行结果如图:
测试项目:
首先测试需要mock DBContext,大家可以参考单元测试 mock EF 中DbContext 和DbSet Include 来做,其次我们需要一个DbHelper,用它来货物DbContext 和初始化数据:
那么测试项目的code 也就非常简单:
看这里的测试已经通过了, 这个DbContext是所有的测试共用的,就如同我们的数据库一样,尤其是DbContext的表比较多(500以上),那么mock这个DbContext需要花费比较长的时间。
整个项目的结构就说完了,一般我们的controller的ioc都是做服务层,而服务层又需要ioc数据层,就像我前面的Asp.net WebAPI 单元测试里面的GetIArticleService方法,其实现还是比较累的,太多的mock了,
同时在controller那里的ioc 的code也就比较多了,每增加一个controller就需要增加一个对应的service,那么ioc对应的配置也要增加 是不是很麻烦了? 所以索性直接ioc DbContext。因为在我们很多实际项目中service中的code 重用性不是很高,每当增加controller的时候,一般都要增加service去实现相应的逻辑,比如一个查询逻辑现在有3个service已经实现了,但是在controller你可能不直接用这3个service, 而是重新建一个service,把3个EF 查询合并成一个,这样EF访问3次DB 就变为一次,并且不需要的数据也不会返回了。所以这里的DbContext真的是一站到底, 从数据层经过服务层最后坚持到接口层,而单元测试的难点就在如何mock DbContext,这里我们采用万剑归中的方式来做(表达式给DbContext的DbSet赋值)。
下载地址
Asp.net WebAPI 单元测试
单元测试 mock EF 中DbContext 和DbSet Include
先看一下项目结构图:
public class StructureMapScope : IDependencyScope { private readonly IContainer container; public StructureMapScope(IContainer container) { if (container == null) { throw new ArgumentNullException("container"); } this.container = container; } public object GetService(Type serviceType) { if (serviceType == null) { return null; } if (serviceType.IsAbstract || serviceType.IsInterface) { return this.container.TryGetInstance(serviceType); } return this.container.GetInstance(serviceType); } public IEnumerable<object> GetServices(Type serviceType) { return this.container.GetAllInstances(serviceType).Cast<object>(); } public void Dispose() { this.container.Dispose(); } } public class StructureMapDependencyResolver : StructureMapScope, IDependencyResolver { private readonly IContainer container; public StructureMapDependencyResolver(IContainer container) : base(container) { this.container = container; } public IDependencyScope BeginScope() { var childContainer = this.container.GetNestedContainer(); return new StructureMapScope(childContainer); } }
View Code
具体使用如下:
api运行结果如图:
测试项目:
首先测试需要mock DBContext,大家可以参考单元测试 mock EF 中DbContext 和DbSet Include 来做,其次我们需要一个DbHelper,用它来货物DbContext 和初始化数据:
那么测试项目的code 也就非常简单:
看这里的测试已经通过了, 这个DbContext是所有的测试共用的,就如同我们的数据库一样,尤其是DbContext的表比较多(500以上),那么mock这个DbContext需要花费比较长的时间。
整个项目的结构就说完了,一般我们的controller的ioc都是做服务层,而服务层又需要ioc数据层,就像我前面的Asp.net WebAPI 单元测试里面的GetIArticleService方法,其实现还是比较累的,太多的mock了,
同时在controller那里的ioc 的code也就比较多了,每增加一个controller就需要增加一个对应的service,那么ioc对应的配置也要增加 是不是很麻烦了? 所以索性直接ioc DbContext。因为在我们很多实际项目中service中的code 重用性不是很高,每当增加controller的时候,一般都要增加service去实现相应的逻辑,比如一个查询逻辑现在有3个service已经实现了,但是在controller你可能不直接用这3个service, 而是重新建一个service,把3个EF 查询合并成一个,这样EF访问3次DB 就变为一次,并且不需要的数据也不会返回了。所以这里的DbContext真的是一站到底, 从数据层经过服务层最后坚持到接口层,而单元测试的难点就在如何mock DbContext,这里我们采用万剑归中的方式来做(表达式给DbContext的DbSet赋值)。
下载地址
相关文章推荐
- ASP.NET Core 源码阅读笔记(5) ---Microsoft.AspNetCore.Routing路由
- 如何在asp.net中使用多线程及队列,异步处理一个耗时的任务(原创)
- asp.net连接数据库 windows身份验证模式
- MVC4数据注解和验证
- ASP.NET——Bundling and Minification(捆绑和压缩)概述
- [转]在ASP.NET开发中容易忽略的2个小问题 Cookie乱码存取异常 和 iframe弹框的login跳转
- [转]菜鸟程序员之Asp.net MVC Session过期异常的处理
- [转]Asp.net MVC使用Filter解除Session, Cookie等依赖
- Getting started with ASP.NET Core MVC and Visual Studio
- ASP.NET vs MVC vs WebForms
- [转]Membership 到 .NET4.5 之 ASP.NET Identity
- 转: KindEditor 图片空间文件增加删除文件、文件夹功能(ASP语言环境)
- ASP.NET错误处理的三种方式
- [转]Asp.net MVC 利用PartialView 构造自定义菜单
- asp.net Framework 与 asp.net core 知识
- 在raspberry运行xibo
- asp.net web forms和asp.net mvc比较
- asp.net webpage
- BrnShop开源网上商城第二讲:ASP.NET MVC框架
- 比较分析 Spring AOP 和 AspectJ 之间的差别