C# 单元测试:SetUp HtpContextAccessor.HttpContext.GetTokenAsync返回错误:不支持的表达式异常GetTokenAsync

C# 单元测试:SetUp HtpContextAccessor.HttpContext.GetTokenAsync返回错误:不支持的表达式异常GetTokenAsync,c#,unit-testing,nunit,moq,C#,Unit Testing,Nunit,Moq,我正在尝试对下面的代码进行单元测试 public async Task<AppErrorCountByDateListVm> GetAppErrorCountByDateAsync() { var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token"); if (accessToken != null)

我正在尝试对下面的代码进行单元测试

    public async Task<AppErrorCountByDateListVm> GetAppErrorCountByDateAsync()
    {
       var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
            if (accessToken != null)
            {
                _httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
            }  
...
我想我错过了几个步骤


任何帮助都将不胜感激。

您遇到的错误是因为您试图模拟静态方法(扩展方法)。你不能这么做,至少在你使用的框架下不能

我也遇到过同样的问题,我刚刚结束。让我解释一下。。。 在HttpContext上创建一个包装器对象,使用它可以模拟“GetTokenAsync”

看这个,它有一个很好的例子来说明这个问题


当然,还有其他方法可以模拟静态方法,请看一下

谢谢您的回复。我暂时摆脱了这个问题,但现在又回到了这个问题上。由于某些原因,我想要进行单元测试的原始代码没有正确复制,所以我更新了该部分。我花了一些时间尝试你的一些想法,但我不明白。我不明白当HttpContext是HttpContextAccessor的一个属性时,如何包装它。对不起,我有点糊涂了。我就是不明白。你能再给我一些提示吗。谢谢@Yassine
        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.