您的位置:首页 > 运维架构

.NET Core 2.0 单元测试中初识 IOptionsMonitor<T>

2017-08-30 07:21 459 查看
在针对下面设置 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);
}

原文地址:http://www.cnblogs.com/dudu/p/7424667.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: