Ответ 1
Мне удалось обойти это так, что я уверен, что это не оптимально, но мне придется делать это, пока я не найду лучшего решения, или один из вас, прекрасные люди, подскажет мне лучший способ сделать это:) Я сделал это следующим образом:
-
В моем классе Startup я добавил крюк CreateAuthFilter, который мы увидим позже, используется только в тестах интеграции:
// Sample Startup class public class Startup { public void Configuration(IAppBuilder app) { var config = new HttpConfiguration(); // Use CreateFilter Method to create Authorisation Filter - if not null add it var authFilter = CreateAuthFilter(); if(authFilter != null) config.Filters.Add(authFilter); // Other configuration and middleware... } public static Func<IFilter> CreateAuthFilter = () => null; }
-
Реализован фильтр авторизации, который будет использоваться только в тестах интеграции:
public class TestAuthFilter : IAuthenticationFilter { static TestAuthFilter() { TestUserId = "TestDomain\\TestUser"; } public bool AllowMultiple { get; private set; } public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) { context.Principal = new ClientRolePrincipal(new HttpListenerBasicIdentity(TestUserId, "password")); ; } public static string TestUserId { get; set; } public async Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { } }
-
В коде SetUp для моих тестов интеграции я добавляю фильтр тестовой авторизации:
Startup.CreateAuthFilter = () => new TestAuthFilter(); var TestServer = TestServer.Create<Startup>();
-
При необходимости в определенных тестах я устанавливаю TestUserId на известное значение, а другие тесты работают, потому что присутствует фильтр Auth:
TestAuthFilter.TestUserId = testUser.UserId;
Я делюсь этим здесь, потому что он помогает другим, но, пожалуйста, кто-нибудь скажет мне лучший способ! По крайней мере, я уверен, что есть лучший способ ввести мой тестовый фильтр, не включая код в Startup... Я просто не думал об этом.