体验 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 ...
随机推荐
- app:processDebugResources
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugResources'. ...
- testng.xml 配置大全
1.TestNG的运行方式如下: 1 With a testng.xml file 直接run as test suite 2 With ant 使用ant 3 From the command li ...
- 深入理解JS执行细节(写的很精辟)
来源于:http://www.cnblogs.com/onepixel/p/5090799.html javascript从定义到执行,JS引擎在实现层做了很多初始化工作,因此在学习JS引擎工作机制之 ...
- AirServer for Mac(Airplay 终端实用工具)破解版安装
1.软件简介 AirServer 是一款 Mac 上的 AirPlay 终端,通过这款软件,利用 AirPlay 技术,iPhone 或 iPad 就可以无线连接到 Mac 上,不需要在 iPh ...
- Git 安装(分布式版本控制系统)
1.在 Windows 上安装 在 Windows 上安装 Git 也有几种安装方法. 官方版本可以在 Git 官方网站下载,打开下载会自动开始.要注意这是一个名为 Git for Windows 的 ...
- Swift 模式匹配
前言 在 Swift 中模式匹配是个重要的概念. 最常用的模式匹配是 switch 语法. 模式匹配非常灵活,在使用 switch 进行一轮模式匹配时,不需要所有的 case 都是同一种风格. let ...
- 11g新特性 -- Virtual Private Catalogs
在oracle 11g之前版本中,如果用户只是需要访问recovery catalog 中的某个数据库,但是我们却只能将整个recovery catalog授权给他,无法做到严格限制. 现在,virt ...
- 使用dstat命令的插件查看mysql的io状态
使用dstat竟然还可以查看mysql的状态, man dstat之后发现的,原来在/usr/share/dstat目录下藏有很多python脚本作为插件帮助dstat搜集各类信息. 不过通常有可能会 ...
- 译:5.RabbitMQ Java Client 之 Topics (主题)
在 上篇博文 译:4.RabbitMQ 之Routing(路由) 中,我们改进了日志系统. 我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换) ,并且有可能选 ...
- Android美丽的对话框项目sweet-alert-dialog
美丽的对话框 sweet-alert-dialog 项目地址: https://github.com/pedant/sweet-alert-dialog android原生的dialog太生硬了,之前 ...