这是昨天解决的一个问题,针对一个 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的更多相关文章

  1. MySQL官方.NET Core驱动已出,支持EF Core

    千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功能已经可用. NuGet 地址:https:/ ...

  2. NET Core驱动已出,支持EF Core

    NET Core驱动已出,支持EF Core 千呼万唤始出来MySQL官方.NET Core驱动已出,支持EF Core. 昨天MySQL官方已经发布了.NET Core 驱动,目前还是预览版,不过功 ...

  3. [翻译 EF Core in Action 1.9] 掀开EF Core的引擎盖看看EF Core内部是如何工作的

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  4. 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 ...

  5. asp.net core 实战项目(一)——ef core的使用

    数据库设计 数据结构图如下:   此次实例比较简单,暂时只设计到上述3张表 SMUser:用于存储用户信息. Role:用于存储角色信息. SMUser_Role:用建立用户和角色关系的一直关联表. ...

  6. EF 6.x、EF Core实现dynamic动态查询和EF Core实现多个上下文实例池你了解多少?

    前言 很长一段时间没有写博客了,今天补上一篇吧,偶尔发现不太愿意写博客了,太耗费时间,不过还是在坚持当中,毕竟或许写出来的东西能帮到一些童鞋吧,接下来我们直奔主题.无论是在在EF 6.x还是EF Co ...

  7. [翻译 EF Core in Action 2.3] 理解EF Core数据库查询

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  8. .Net Core+Angular6 学习 第四部分(EF Core(Code First))

    目的: 打算通过EF core 练习从database receive data 显示到UI. 1. 创建一个新的project Model.定义一个 base interface entity以及实 ...

  9. 把旧系统迁移到.Net Core 2.0 日记(10) -- EF core 和之前版本多对多映射区别

    EF Core 现在不支持多对多映射,只能做2个一对多映射. 比如Product和Category 我现在定义Product和Category是多对多关系. 那么实体定义如下: public clas ...

随机推荐

  1. 安装nginx和添加ssl证书

    一. 准备: 1. 需要有一台centos的服务器 2. 域名解析到服务器 3. 域名的nginx证书 二. 安装Nginx(输入下面的指令后:可访问实验机器外网 HTTP 服务http://118. ...

  2. SharePoint Farm 3-Tier拓扑结构的实施解决方案

    难得的假期,难得有时间来梳理知识. 我写过很多关于SharePoint的安装和配置,有利用PowerShell的,也有图形安装界面的. 也演示了怎样创建一个双层的SharePoint Farm,怎样利 ...

  3. 第三部分:Android 应用程序接口指南---第二节:UI---第十二章 自定义组件

    第12章 自定义组件 Android平台提供了一套完备的.功能强大的组件化模型用于搭建用户界面,这套组件化模型以View和 ViewGroup这两个基础布局类为基础.平台本身已预先实现了多种用于构建界 ...

  4. Hexo NexT 博客与Github page 关联指南

    上篇文章 Hexo 博客框架NexT主题搭建指南 我们已经在本地搭建好了Hexo博客框架NexT 主题的博客程序,但是这感觉还是远远不够. 我们还想把它部署到我们的Github上,让其他人可以看到我们 ...

  5. Atitit 提升进度的大原则与方法  高层方法  attilax总结

    Atitit 提升进度的大原则与方法  高层方法  attilax总结 生产力的提升点 1.1. 管理,管理的发展发展非常缓慢,1 1.2. 方法论(前后分离,dsl等)1 1.3. 工具( 工具链 ...

  6. linux每日命令(2):cd命令

    1.命令格式: cd [目录名] 2.命令功能 切换当前目录至 [目录名] 3. 常用范例 1.进入系统根目录 命令: cd / 说明:进入系统根目录,上面命令执行完后拿ls命令看一下,当前目录已经到 ...

  7. Google file system

    读完了Google file system论文的中文版,记录一下总结,懒得打字,直接上草图:

  8. 【转】css3实现文字闪烁,改变透明度

    <style> @-webkit-keyframes shake{ 0%{ opacity: 1; } 50%{ opacity: 0.5; } 100%{ opacity: 1; } } ...

  9. mac通过路径找到对应的文件夹

    在finder中 command + shift + G 跳出窗口中输入指定的路径,即可到达.

  10. Leaflet API翻译

    转自: http://jsrookie.iteye.com/blog/2318972(上) http://jsrookie.iteye.com/blog/2318973(下) L.Map API各种类 ...