体验 ASP.NET Core 集成测试三剑客:xUnit.net、TestServer、EF Core InMemory
这是昨天解决的一个问题,针对一个 web api 的客户端代理类写集成测试,既要测试 web api,又要测试 web api 客户端。
测试 web api,就要在运行测试时自动启动 web api 站点,asp.net core 中的 TestServer 就是为此而生,而且与 asp.net core 结合的天衣无缝,不仅自己可以通过I WebHostBuilder 配置站点,而且可以直接使用 web api 站点的 Startup 类。
对于测试时的数据模拟,可以通过 EF Core 提供的 InMemory database ,使用起来超级简单,只需在依赖注入 DbContext 时使用 options.UseInMemoryDatabase() 。
而对于 TestServer 的统一管理(配置、启动、销毁),对所测试的类的依赖注入,可以借助 xUnit.net 的 fixture class ,详见 Shared Context between Tests 。
xUnit.net fixture class 的示例代码如下:
public class WebApiTestFixture : IDisposable
{
private readonly TestServer _testServer; public WebApiTestFixture()
{
IWebHostBuilder webHostBuilder = WebHost.CreateDefaultBuilder()
.ConfigureLogging((logging) =>
{
logging.AddConsole();
})
.ConfigureServices(services =>
{
services.AddSingleton<IMemcachedClient, NullMemcachedClient>();
services.AddDbContext<UCenterDbContext>(options =>
{
options.UseInMemoryDatabase("UCenter");
});
})
.UseStartup<Startup>(); _testServer = new TestServer(webHostBuilder);
ServerServices = _testServer.Host.Services;
ProvisionData(ServerServices.GetRequiredService<UCenterDbContext>());
ConfigureClientServices(_testServer.CreateClient());
} public IServiceProvider ClientServices { get; private set; }
public IServiceProvider ServerServices { get; private set; } private void ConfigureClientServices(HttpClient httpClient)
{
IServiceCollection services = new ServiceCollection();
services.AddSingleton<IMemcachedClient, NullMemcachedClient>();
services.AddLogging(builder => builder.AddConsole());
services.AddSingleton(httpClient);
services.AddSingleton<IUCenterService, UCenterService>();
ClientServices = services.BuildServiceProvider();
} private void ProvisionData(UCenterDbContext dbContext)
{
//dbContext.Add();
dbContext.SaveChanges();
} public void Dispose()
{
_testServer.Dispose();
}
}
集成测试的示例代码如下:
public class UCenterServiceTests : IClassFixture<WebApiTestFixture>
{
private readonly IUCenterService _ucenterService;
private readonly UCenterDbContext _dbContext; public UCenterServiceTests(WebApiTestFixture fixture)
{
_ucenterService = fixture.ClientServices.GetService<IUCenterService>();
_dbContext = fixture.ServerServices.GetService<UCenterDbContext>();
} [Fact]
public async Task GetUserTest()
{
var fakeUser = _dbContext.Users.FirstOrDefault(); var user = await _ucenterService.GetUser(u => u.DisplayName, fakeUser.DisplayName);
user.ShouldNotBeNull();
user.BlogApp.ShouldBe(fakeUser.BlogApp);
}
}
体验 ASP.NET Core 集成测试三剑客:xUnit.net、TestServer、EF Core InMemory的更多相关文章
- MySQL官方.NET Core驱动已出,支持EF Core
千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...
- NET Core驱动已出,支持EF Core
NET Core驱动已出,支持EF Core 千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功 ...
- [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- Cookies 初识 Dotnetspider EF 6.x、EF Core实现dynamic动态查询和EF Core注入多个上下文实例池你知道有什么问题? EntityFramework Core 运行dotnet ef命令迁移背后本质是什么?(EF Core迁移原理)
Cookies 1.创建HttpCookies Cookie=new HttpCookies("CookieName");2.添加内容Cookie.Values.Add(&qu ...
- asp.net core 实战项目(一)——ef core的使用
数据库设计 数据结构图如下: 此次实例比较简单,暂时只设计到上述3张表 SMUser:用于存储用户信息. Role:用于存储角色信息. SMUser_Role:用建立用户和角色关系的一直关联表. ...
- EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?
前言 很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题.无论是在在EF 6.x还是EF Co ...
- [翻译 EF Core in Action 2.3] 理解EF Core数据库查询
Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...
- .Net Core+Angular6 学习 第四部分(EF Core(Code First))
目的: 打算通过EF core 练习从database receive data 显示到UI. 1. 创建一个新的project Model.定义一个 base interface entity以及实 ...
- 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别
EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...
随机推荐
- C语言定义共享全局变量
好久没写C语言了,突然忘记怎么定义全局共享变量了,由于老项目的Code Base都是C的风格,其中又大量用了全局变量,只能跟着糊一坨shit上去了.没办法. 再共享全局变量的global_shared ...
- Swift 柯里化
前言 由于柯里化在业务层的应用较少,所以从 Swift 3.0 开始移除了柯里化的用法,但是 Swift 的很多底层特性是使用柯里化来表达的. 1.柯里化 1.1 柯里化简介 柯里化(Currying ...
- 最新以及历史各版本 .NET Framework 的下载
唔,如题,详见地址:https://www.microsoft.com/net/download/windows
- linux每日命令(19):locate 命令
locate 让使用者可以很快速的搜寻档案系统内是否有指定的档案.其方法是先建立一个包括系统内所有档案名称及路径的数据库,之后当寻找时就只需查询这个数据库,而不必实际深入档案系统之中了.在一般的 di ...
- Node入门教程(9)第七章:NodeJs的文件处理
Node的文件处理涉及到前面说的ptah模块,以及fs文件系统.stream流处理.Buffer缓冲器等模块.内容可能比较多,相关内容请以官网文档为主,此处主要以案例讲解为主,分享给大家一些常用的经典 ...
- Could not load file or assembly 'System.Core, Version=2.0.5.0
项目中用的4.0,本机没问题,服务器上出现问题,查了一下发现 autofac 里面用的这个版本 解决:下载安装这个4.0的补丁 http://support.microsoft.com/kb/246 ...
- java中的数据加密4 数字签名
数字签名 它是确定交换消息的通信方身份的第一个级别.A通过使用公钥加密数据后发给B,B利用私钥解密就得到了需要的数据,问题来了,由于都是使用公钥加密,那么如何检验是A发过来的消息呢?上面也提到了一点, ...
- Tip 18 – How to decide on a lifetime for your ObjectContext
Alex D James 7 May 2009 3:44 PM One of the most common questions we get is how long should an Object ...
- Oracle中Select语句完整的执行顺序
oracle Select语句完整的执行顺序: .from 子句组装来自不同数据源的数据: .where 子句基于指定的条件对记录行进行筛选: .group by子句将数据划分为多个分组: .使用聚集 ...
- Hadoop、Spark 集群环境搭建
1.基础环境搭建 1.1运行环境说明 1.1.1硬软件环境 主机操作系统:Windows 64位,四核8线程,主频3.2G,8G内存 虚拟软件:VMware Workstation Pro 虚拟机操作 ...