Я использую Visual Studio 2015 Enterprise Update 1 и ASP.NET 5 rc1-final для создания конечной точки, которая выдает и использует токены JWT, как подробно описано здесь.
Теперь я перехожу к модульному тестированию и сталкиваюсь с трудностями при тестировании некоторых аспектов AspNet.Security.OpenIdConnect.Server (OIDC/ASOS). В частности, некоторые примитивы ASOS, такие как LogoutEndpointContext, не являются абстрактными, поэтому их нелегко подделать. Обычно я просто добавляю fake к таким типам, но Похоже, что DNX не поддерживает подделки, по крайней мере, пока. Эти типы также запечатаны, поэтому я не могу их специализировать.
Это вынудило меня написать некий ненадежный код отражения, чтобы создать такие запечатанные типы ASOS. Вот пример тестов XUnit, для которого требуется LogoutEndpointContext, чтобы я мог проверить свою обработку событий OpenIdConnectServerProvider (в этом случае выход из системы без POST должен вызвать исключение); обратите внимание на отражение, которое мне нужно сделать, чтобы создать экземпляр LogoutEndpointContext:
[Fact]
async public Task API_Initialization_Services_AuthenticatedUser_Authentication_LogoutEndpoint_XSRF_Unit()
{
// Arrange
Mock<HttpRequest> mockRequest = new Mock<HttpRequest>();
mockRequest.SetupGet(a => a.Method).Returns(() => "Not Post");
Mock<HttpContext> mockContext = new Mock<HttpContext>();
mockContext.SetupGet(a => a.Request).Returns(() => mockRequest.Object);
OpenIdConnectServerOptions options = new OpenIdConnectServerOptions();
OpenIdConnectMessage request = new OpenIdConnectMessage();
// I would prefer not to use reflection
var ctorInfo = typeof(LogoutEndpointContext).GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single();
LogoutEndpointContext context = (LogoutEndpointContext)ctorInfo.Invoke(new object[] {mockContext.Object,options, request});
// Act
AuthenticationEvents authenticationEvents = new AuthenticationEvents();
// Assert
await Assert.ThrowsAsync<SecurityTokenValidationException>(() => authenticationEvents.LogoutEndpoint(context));
}
Будем очень признательны за любые советы о том, как лучше создавать/имитировать/подделывать/специализировать запечатанные типы ASOS, такие как LogoutEndpointContext.