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.