Найти в Дзене
invalid_token - The signature key was not found. ASP.NET Core 8, Minimal API
Собственно, в процессе написания автотестов с WebApplicationFactory наткнулся на такую ошибку (см. заголовок). Для тестирования вызовов с авторизацией использовал собственную генерацию токенов JWT: public static class MockJwtTokens { public const string StaticIssuer = "MockIssuer"; public static string Issuer { get; } = StaticIssuer; //Guid.NewGuid().ToString(); // Random issuer public static SecurityKey SecurityKey { get; } static MockJwtTokens() { var key = new byte[32]; using (var rng = RandomNumberGenerator...
2 недели назад
.NET Core 8, Azure DevOps, и System.InvalidOperationException : Solution root could not be located using application root
И вот бывает же такое. Пилим тесты с использованием WebApplicationFactory... Который уже проект, все примерно одинаково, все идет нормально... И тут, внезапно, ровно один проект начинает выдавать ошибку - но не просто так, а только при исполнении из pipeline Azure DevOps. Ошибка - на старте factory, System.InvalidOperationException : Solution root could not be located using application root. Ошибка, которую давным давно, еще с 6 .NET Core должны были, вроде как, побороть. А тут у нас .NET Core 8, причем соседний похожий проект в этом же solution исполняется вообще без проблем. Да, я прочитал документацию...
2 месяца назад
.NET Core 8, Minimal API и JSON Options
В общем, вопрос был в том, как задать опции сериализации / десериализации для Minimal API. Для контроллеров это делаю так: builder.Services.AddControllers(options => { .... }).AddJsonOptions(options => { // Убираем Camel-case style форматирования в JSON options.JsonSerializerOptions.PropertyNamingPolicy = null; }); А вот для Minimal API делаем так: builder.Services.ConfigureHttpJsonOptions(options => { // Убираем Camel-case style форматирования в JSON options...
2 месяца назад
WebApplicationFactory, AutoMapper, и доступ к активной конфигурации
В общем-то, задача простая, но на всякий случай, запишу для памяти. Итак, есть у нас интеграционный тест с xUnit и WebApplicationFactory. Но при этом нужно: 1) Получить лицензионный ключ AutoMapper, который сконфигурирован на проверяемом сервисе 2) Проверить стороннюю (не используемую на сервисе) конфигурацию AutoMapper Код у меня получился такой: // Arrange IConfiguration configuration = _factory.Services.GetRequiredService<IConfiguration>(); string? storedLicenseKey = configuration["AutoMapperLicenseKey"]; if (string.IsNullOrEmpty(storedLicenseKey)) throw new Exception("Не найден ключ лицензии AutoMapper"); using var scope = _factory...
2 месяца назад
.NET Framework 4.8 и TimeSpan.ToString
Долго не мог понять, почему не подходит стандартная строка форматирования, например "HH:mm:ss". И "hh:mm:ss". И только почти случайно обнаружил, что работает оно так: Value.ToString("hh':'mm':'ss")
4 месяца назад
EF Core и интеграционные тесты
Дела делаются быстро, если под руками толковый пример кода. Собственно, лежит этот пример здесь: https://github.com/dotnet/EntityFramework.Docs/blob/live/samples/core/Testing/TestingWithoutTheDatabase/SqliteInMemoryBloggingControllerTest.cs. Статья про тестирование с EF Core (точнее, про одно из направлений тестирования) - здесь: https://learn.microsoft.com/en-us/ef/core/testing/testing-without-the-database. Как мне вообще понадобились такие интеграционные тесты? Ну, есть кой-какие моменты, которые хочется прояснить на уровне тестов. Например, обработка некоторых ошибок взаимодействия с базой. А, кстати...
4 месяца назад
CS1570: XML comment has badly formed XML
Неожиданная вещь случилась. Пишу комментарий: /// См. <a href="https://learn.microsoft.com/ru-ru/aspnet/core/test/integration-tests?view=aspnetcore-8.0&pivots=xunit>">Интеграционные тесты на платформе ASP.NET Core</a> Получаю при сборке предупреждение CS1570. Компилятору не нравится, что в URL присутствует символ амперсанда. Потыкал по разному в код, посмотрел доки, попробовал тег "see href". Пока что оставил вот в каком виде: /// См...
4 месяца назад
Тестирование конфигурации для AutoMapper
Точнее, это должно было быть тестирование профилей для AutoMapper, но тут я как-то задолбался придумывать пути по просовыванию лицензионного ключа непосредственно к тестам, и потому пошел пока что по несколько упрощенному пути. У меня уже есть настроенный на все что нужно проект сервиса. С него стандартным образом используем Program / Main (см. https://dzen.ru/a/aFiU7IOvXDA6zAAQ). И проверяем, получается, конфигурацию AutoMapper целиком, что меня вполне устраивает: public class AutomapperProfileIntegrationTest : IClassFixture<WebApplicationFactory<Program>> { private readonly WebApplicationFactory<Program>...
5 месяцев назад
ASP.NET Core 8: почему в ответе код 201 заменяется на 200?
Простая ситуация: в контроллере в конце возвращаем код 201 (Создано), без указания созданного объекта, или его адреса: return Created(); И в тестах с удивлением я обнаруживаю результат с кодом 200 (ОК). После некоторого исследования, я выяснил, что это таки баг: https://github.com/dotnet/aspnetcore/issues/53734. Вроде как этот баг исправлен в рамках ...
6 месяцев назад
Интеграционные тесты для ASP.NET Core 8 Web API
Уточняю: тестировать я буду контроллер (см. https://dzen.ru/a/aERZVGOmEkUkVxAm) - с использованием xUnit v3 и пакета Microsoft.AspNetCore.Mvc.Testing. И без Moq. Основная статья, откуда я все это брал - вот: https://learn.microsoft.com/ru-ru/aspnet/core/test/integration-tests?view=aspnetcore-8.0&pivots=xunit. Кстати, для .NET Core 9 там код слегка поменялся, так что при переходе с .NET Core 8 на .NET Core 9 придется менять часть кода в тестовом проекте. Итак. Во-первых, в проекте с сервисами и хостингом сервисов, в точке входа (Program.cs) пришлось немного переделать код: 1. Добавить атрибут: #if DEBUG [assembly: InternalsVisibleTo("Foo...
6 месяцев назад
HttpUtility.UrlEncode vs Uri.EscapeDataString
Общая идея такая: если нет каких-то особых условий использования, то лучше использовать EscapeDataString (как минимум, не будет проблем с пробелами). Обсуждение на эту тему можно почитать здесь (https://stackoverflow.com/questions/31156247/httputility-urlencode-vs-uri-escapeuristring-in-net) и здесь (https://stackoverflow...
6 месяцев назад