【发布时间】:2020-06-25 21:54:05
【问题描述】:
我在开发时尝试做 TDD,但我很挣扎。我的第一个测试我可以成功获得在 services.AddAuthentication(...) 中设置的选项,但是我无法从添加到上一个调用中的 .AddCookie(..) 中获得选项。在调试期间,我确实看到为 CookieAuthenticationOptions 添加了一个 IPostConfigureOptions,我怀疑它以某种方式更改了默认选项值,但我不知道如何获取它。
要测试的代码:
public static void AddOpenIdConnect(this IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options => { options.MinimumSameSitePolicy = SameSiteMode.None; });
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(
CookieAuthenticationDefaults.AuthenticationScheme,
options =>
{
options.ExpireTimeSpan = TimeSpan.FromHours(2);
options.SlidingExpiration = true;
options.AccessDeniedPath = new PathString("/Error/403");
}
);
}
我的第一个测试确保设置了 AuthenticationOptions,并且通过了:
[TestMethod]
public void AddOpenIdConnect_Should_AddAuthenticationOptions()
{
// arrange
var services = new ServiceCollection();
// act
services.AddOpenIdConnect();
// assert
var provider = services.BuildServiceProvider();
var authOptions = provider.GetRequiredService<IOptions<AuthenticationOptions>>();
authOptions.Value.DefaultScheme.Should().Be(CookieAuthenticationDefaults.AuthenticationScheme);
authOptions.Value.DefaultChallengeScheme.Should().Be(OpenIdConnectDefaults.AuthenticationScheme);
}
此方法失败,因为 AccessDeniedPath 返回默认设置,而不是正在测试的代码设置的设置(您可以看到我注释掉了对 ExpireTimeSpan 的检查,因为它也失败了。)
[TestMethod]
public void AddOpenIdConnect_Should_AddCookieAuthenticationOptions()
{
// arrange
var services = new ServiceCollection();
// act
services.AddOpenIdConnect();
// assert
var provider = services.BuildServiceProvider();
var authCookieOptions = provider.GetRequiredService<IOptions<CookieAuthenticationOptions>>();
//authCookieOptions.Value.ExpireTimeSpan.Should().Be(TimeSpan.FromHours(2));
authCookieOptions.Value.SlidingExpiration.Should().BeTrue();
authCookieOptions.Value.AccessDeniedPath.Should().Be("/Error/403");
}
任何帮助将不胜感激,因为在此之后我仍然需要添加“.AddOpenIdConnect(options =>”。
谢谢!
【问题讨论】:
标签: c# unit-testing asp.net-core dependency-injection