在针对下面设置 CookieAuthenticationOptions 的扩展方法写单元测试时遇到了问题。

public static IServiceCollection AddCnblogsAuthentication(this IServiceCollection services,
IConfigurationSection redisConfiguration,
Action<CookieAuthenticationOptions> configureOption = null)
{
//...
}

想通过下面的单元测试验证对 CookieAuthenticationOptions 的设置是否生效:

public void AddCnblogsAuthenticationTest()
{
IServiceCollection services = new ServiceCollection();
var builder = new ConfigurationBuilder();
builder.AddInMemoryCollection(new Dictionary<string, string>
{
["redis"] = JsonConvert.SerializeObject(new CnblogsRedisOptions())
});
var configuration = builder.Build(); services.AddCnblogsAuthentication(configuration.GetSection("redis"),
option =>
{
option.LoginPath = "/users/signin";
}); var options = services.BuildServiceProvider()
.GetRequiredService<IOptions<CookieAuthenticationOptions>>().Value;
Assert.Equal("/users/signin", options?.LoginPath);
}

但通过依赖注入解析 IOptions<CookieAuthenticationOptions> 接口得到的 CookieAuthenticationOptions 实例的值都是默认值, AddCnblogsAuthentication() 中的设置没生效。

后来查看 CookieAuthenticationHandler 的实现代码才知道需要通过 IOptionsMonitor<CookieAuthenticationOptions> 接口解析,而且需要调用该接口的 Get() 方法(而不是 CurrentValue 属性)根据指定的 AuthenticationScheme 才能获取到所需的 CookieAuthenticationOptions 实例。

public void AddCnblogsAuthenticationTest()
{
//...
var options = services.BuildServiceProvider()
.GetRequiredService<IOptionsMonitor<CookieAuthenticationOptions>>()
.Get(CookieAuthenticationDefaults.AuthenticationScheme);
Assert.Equal("/users/signin", options?.LoginPath);
}

.NET Core 2.0 单元测试中初识 IOptionsMonitor<T>的更多相关文章

  1. ASP.NET Core 3.0 WebApi中使用Swagger生成API文档简介

    参考地址,官网:https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/getting-started-with-swashbuckle?view ...

  2. .net core 3.0 WPF中使用FolderBrowserDialog

    前言 随着.net core 3.0 的发布,WPF 也可以在 core 平台上使用了.当前的 WPF 不支持跨平台,仅能够在 Windows 平台上使用.如果想体验 WPF 跨平台开发,可以访问开源 ...

  3. .NET Core 3.0 单元测试与 Asp.Net Core 3.0 集成测试

    单元测试与集成测试 测试必要性说明 相信大家在看到单元测试与集成测试这个标题时,会有很多感慨,我们无数次的在实践中提到要做单元测试.集成测试,但是大多数项目都没有做或者仅建了项目文件.这里有客观原因, ...

  4. NET Core 3.0 项目中使用 AutoFac

    .net core 3.1 今天已正式发布,3.1跟3.0差别不是很大,主要是对 3.0一小部分修复和完善,最重要的是.NET Core 3.1是长期支持(LTS)版本,建议大家升级. .net co ...

  5. ASP.NET Core 5.0 MVC中的 Razor 页面 介绍

    Razor 是一个用于将基于服务器的代码嵌入到网页中的标记语法. Razor语法由 Razor 标记.c # 和 HTML 组成. 通常包含 Razor 的文件的扩展名 cshtml Razor 语法 ...

  6. 使用xUnit为.net core程序进行单元测试(中)

    第一部分: http://www.cnblogs.com/cgzl/p/8283610.html 下面有一点点内容是重叠的.... String Assert 测试string是否相等: [Fact] ...

  7. ASP.NET Core 5.0 MVC中的视图分类——布局视图、启动视图、具体视图、分部视图

    一.创建MVC应用程序 创建后的项目 二.(全局性)启动视图 _ViewStart.cshtml 顾名思义,就是在View开始执行之前执行,而且是每一个View, 它的预设内容是 @{ Layout ...

  8. .Net Core 3.0 MVC 中使用 SqlSugar ORM框架

    介绍 SqlSugar 是一款简单易用的ORM ,在国内市场占有率也比较高, 在今年10月份官网改版后  提供了完整的服务,让您的项目没有后顾之忧 下载地址 :https://github.com/s ...

  9. ASP.Net Core 5.0 MVC中AOP思想的体现(五种过滤器)并结合项目案例说明过滤器的用法

    执行顺序 使用方法,首先实现各自的接口,override里面的方法, 然后在startup 类的 ConfigureServices 方法,注册它们. 下面我将代码贴出来,照着模仿就可以了 IActi ...

随机推荐

  1. 1分钟试用PowerShell 5.0新功能PowerShellGet安装Script Browser和Script Analyzer

    微软PowerShell 产品组上周发布了PowerShell 5.0 PowerShellGet功能.有了它,IT 人员可以方便地搜索,安装,更新PowerShell Module.在这篇博客中,我 ...

  2. spring-boot 1.X集成swagger

    1.引入POM依赖 <properties> <swagger-annotations.version>1.5.13</swagger-annotations.versi ...

  3. windows IOCP入门的一些资料

    最近需要看一个中间件的IOCP处理模块,需要了解这方面的知识 https://www.codeproject.com/articles/13382/a-simple-application-using ...

  4. 译:5.RabbitMQ Java Client 之 Topics (主题)

    在 上篇博文 译:4.RabbitMQ 之Routing(路由) 中,我们改进了日志系统. 我们使用的是direct(直接交换),而不是使用只能进行虚拟广播的 fanout(扇出交换) ,并且有可能选 ...

  5. Nginx-rtmp 直播媒体实时流实现

    0. 前言 这段时间在搭建一个IPCamera项目服务器.视频点对点通话,客户端会查看设备端的音视频实时流.为了省流量,是通过P2P进行穿透.但是由于NAT设备的原因和IPV4的枯竭.有些设备是无法进 ...

  6. Node入门教程(9)第七章:NodeJs的文件处理

    Node的文件处理涉及到前面说的ptah模块,以及fs文件系统.stream流处理.Buffer缓冲器等模块.内容可能比较多,相关内容请以官网文档为主,此处主要以案例讲解为主,分享给大家一些常用的经典 ...

  7. vue.js是什么

    Vue.js(读音 /vjuː/, 类似于 view) 是一套构建用户界面的 渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习, ...

  8. 【HTTP】 认证和单点登录 【瞎写的…】

    ■ Cookie,Session,Token HTTP协议是一种无状态的协议.换言之,每一个HTTP请求在得到HTTP回应之后就会断开客户端到服务端的连接.客户端可能会有下一次请求,但是那是下一次的事 ...

  9. file_name[:-4]

    file_name: chair_0001.off file_name[:-4] : chair_0001

  10. Springboot学习笔记(六)-配置化注入

    前言 前面写过一个Springboot学习笔记(一)-线程池的简化及使用,发现有个缺陷,打个比方,我这个线程池写在一个公用服务中,各项参数都定死了,现在有两个服务要调用它,一个服务的线程数通常很多,而 ...