#c# #.net #asp.net-mvc #asp.net-core-mvc #.net-5
#c# #.net #asp.net-mvc #asp.net-core-mvc #.net-5
Вопрос:
Я хочу написать модульный тест для метода контроллера, определенного следующим образом (фактическое регулярное выражение намного сложнее, здесь оно упрощено)
[HttpGet, Route(@"/abc/{X}/{Y}")] /*,
public async Task<IActionResult> GetData(
[FromRoute, Required, RegularExpression(@"^[w]{4,12}$")] string X,
[FromRoute, Required, RegularExpression(@"^[w]{2,24}$")] string Y
)
{
...
}
Теперь, как отмечалось в других вопросах, проверка не работает в модульных тестах. Однако я надеюсь, что кто-нибудь сможет пролить некоторый свет на то, как выполнить модульный тест для кода, который использует параметры верхнего уровня, как показано выше, поскольку все обсуждения, которые я нашел до сих пор, были сосредоточены на проверке модели.
Черт возьми, я использую Net 5.
Комментарии:
1. Не уверен, что этого легко достичь с помощью атрибутов, но вас может заинтересовать такая библиотека, как Guard ( github.com/safakgur/guard ) или FluentValidation ( fluentvalidation.net ). Это позволяет вам легко записывать и читать правила проверки и иметь их в теле вашего метода.
Ответ №1:
Я смог добиться этого, превратив тест в интеграционный тест, используя Refit и IntegrationFixture, как описано в этой статье о CodeProject .
В общем, это что-то вроде этого (всего несколько фрагментов на случай, если ссылка исчезнет):
- Создание интерфейса:
public interface IMyAPI
{
[Get("/abc/{X},{Y}")]
Task<ApiResponse<string>> Get( string X, string Y);
}
- Используйте его в модульном тестировании:
using (var fixture = new RefitFixture<Startup, IMyAPI>(RestService.For<IMyAPI>))
{
var refitClient = fixture.GetRefitClient();
var response = await refitClient.Get(X, Y);
...
}