Модульный тест: SetUp HtpContextAccessor.HttpContext.GetTokenAsyn c возвращает ошибку: неподдерживаемое выражение Exception GetTokenAsync - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь выполнить модульное тестирование приведенного ниже кода.

    public async Task<AppErrorCountByDateListVm> GetAppErrorCountByDateAsync()
    {
       var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
            if (accessToken != null)
            {
                _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
            }  
...

Специально я хочу выполнить moq / setup: _httpContextAccessor.HttpContext.GetTokenAsyn c

Ниже приведен мой модульный тест :

        private IErrorLogService _sut;

        private Mock<HttpClient> _httpClient;
        private Mock<IHttpContextAccessor> _httpContextAccessor;
        private Mock<IJsonSerializerUtility> _jsonSerializerUtility;

        [SetUp]
        public void RunBeforeEachTest()
        {
            _httpClient = new Mock<HttpClient>();
            _httpContextAccessor = new Mock<IHttpContextAccessor>();
            _jsonSerializerUtility = new Mock<IJsonSerializerUtility>();

            _sut = new ErrorLogService(_httpClient.Object, _httpContextAccessor.Object, _jsonSerializerUtility.Object);
        }

        [Test]
        public async Task OnInitializedAsyncTest()
        {
            //Arrange
            _httpContextAccessor.Setup(h => h.HttpContext.GetTokenAsync("access_token")).ReturnsAsync(It.IsAny<string>());

            //Act
            await _sut.GetAppErrorCountByDateAsync();

            //Assert
        }

Я получаю следующие сообщения об ошибках:

System.NotSupportedException : Unsupported expression: ... => ....GetTokenAsync("access_token")
Extension methods (here: AuthenticationHttpContextExtensions.GetTokenAsync) may not be used in setup / verification expressions.

Я предполагаю, что пропускаю несколько шагов.

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 05 марта 2020

Ошибка, которую вы получаете, заключается в том, что вы пытаетесь смоделировать метод stati c (метод расширения). И вы не можете сделать это, по крайней мере, не с той платформой, которую вы используете.

Я столкнулся с той же проблемой, и я просто обернул ее. Позвольте мне объяснить ... Создайте объект-оболочку в HttpContext, с помощью которого вы сможете смоделировать «GetTokenAsyn c».

См. Это Мемуары http-запроса - Как я получил модуль протестировано , у нее есть хороший пример именно этой проблемы.

Конечно, есть и другие способы макетировать методы Stati c, взгляните на Mocking Extension Methods с Moq

...