Создание модульного теста для CORS с контроллером xUnit и .Net Core MVC - PullRequest
0 голосов
/ 21 сентября 2018

Я хочу написать модульный тест, чтобы убедиться, что CORS включен, и что определенный метод WebApi может быть вызван только из клиента, который сообщает, что он из определенного домена.

Я думаю, что сталкиваюсь сздесь описывается распространенная ошибка, при которой он не рассматривается как настоящий междоменный запрос ...

CORS Gotchas

Тип модульного теста будет выглядеть примерно так...

    [Fact]
    public async Task CheckCors()
    {
        var httpClient = new HttpClient();
        httpClient.BaseAddress = new Uri("http://clientdomain.co.uk/");
        httpClient.DefaultRequestHeaders.Accept.Clear();
        httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var response = await client.GetAsync(new Uri($"http://apidomain.co.uk/api/testcors", UriKind.Absolute));

        // Should be forbidden to call the api
        response.StatusCode.Should().Be(HttpStatusCode.Forbidden);
    }

Возможно, я неправильно понял, но кто-нибудь может исправить меня?

1 Ответ

0 голосов
/ 21 сентября 2018

Во-первых, это не модульный тест, потому что вы обращаетесь к какому-либо внешнему ресурсу.Модульные тесты должны иметь какие-либо внешние зависимости.Это действительно интеграционный тест.

Кроме того, на самом деле это не тестирование вашего кода для настройки cors, это тестирование того, что cors действительно работает.

При этом я попытался написать модульный тест для CORS и придумал это.Учитывая, что у меня есть класс, который настраивает CORS

public static class CorsConfig
{
    public static void Register(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["CorsClientUrl"], "*", "*")
        {
            SupportsCredentials = true
        };

        config.EnableCors(cors);
    }
}

Где мой AppSettings["CorsClientUrl"] имеет значение "https://www.google.com"

Так что я хочу проверить, что cors настроен после того, как он вызванВсе мои модульные тесты основаны на SpecificationBase, так что при написании тестов у меня немного больше синтаксиса в стиле BDD

[TestFixture]
public abstract class SpecificationBase
{
    [SetUp]
    public void SetUp()
    {
        Given();
        When();
    }

    protected virtual void Given()
    {
    }

    protected virtual void When()
    {
    }
}

public class ThenAttribute : TestAttribute
{
}

И конечные модульные тесты выглядят так:

    public class WhenConfiguringCors : SpecificationBase
    {
        private HttpConfiguration _httpConfiguration;
        private CorsPolicy _corsPolicy;

        protected override void Given()
        {
            _httpConfiguration = new HttpConfiguration();
        }

        protected override void When()
        {
            CorsConfig.Register(_httpConfiguration);

            var corsConfig = _httpConfiguration.Properties["MS_CorsPolicyProviderFactoryKey"] as AttributeBasedPolicyProviderFactory;

            _corsPolicy =
                corsConfig.DefaultPolicyProvider.GetCorsPolicyAsync(new HttpRequestMessage(), CancellationToken.None)
                    .Result;
        }

        [Then]
        public void ShouldSetOrigin()
        {
            Assert.That(
                _corsPolicy.Origins.Contains("https://www.google.com"), Is.True);
        }

        [Then]
        public void ShouldSupportCredentials()
        {
            Assert.That(
                _corsPolicy.SupportsCredentials, Is.True);
        }
    }
...