SonarQube 给出了从方法调用返回的 ValueTask 实例应该直接等待的问题

问题描述 投票:0回答:1

在我的.NET项目测试项目中,我有这样的方法:

[Fact]
public async Task SampleMethod()
{
  // given
  Guid someRoleId = Guid.NewGuid();
  NpgsqlException npgsqlException = GetNpsqlException();

  var failedRoleStorageException = new FailedRoleStorageException(npgsqlException);

  var expectedRoleDependencyException = new RoleDependencyException(failedRoleStorageException);

  this.dataBrokerMock.SelectRoleByIdAsync(Arg.Any<Guid>()).Throws(npgsqlException);

  // when
  ValueTask<Role> retrieveTenantByIdTask = this.roleService.RoleByIdAsync(someRoleId);

  // then
  RoleDependencyException actualServiceException = await Assert.ThrowsAsync < RoleDependencyException > (() => retrieveTenantByIdTask.AsTask());

  actualServiceException.Should().BeEquivalentTo(
  expectedRoleDependencyException);

  await this.dataBrokerMock.Received(1).SelectRoleByIdAsync(Arg.Any<Guid>());

  this.dataBrokerMock.ClearReceivedCalls();
}

在上面的代码中,这一行给了我以下 SonarQube 代码的味道。

ValueTask
从方法调用返回的实例应直接等待、返回或作为参数传递给另一个方法调用。其他用法,例如将实例存储到本地或字段中,可能表明存在错误,因为
ValueTask
实例只能被消耗一次。

所以我尝试这样解决它,

[Fact]
public async Task SampleMethod()
{
    // given
    Guid someRoleId = Guid.NewGuid();
    NpgsqlException npgsqlException = GetNpsqlException();

    var failedRoleStorageException = new FailedRoleStorageException(npgsqlException);
    var expectedRoleDependencyException = new RoleDependencyException(failedRoleStorageException);

    this.dataBrokerMock.SelectRoleByIdAsync(Arg.Any<Guid>()).Throws(npgsqlException);

    // when and then
    RoleDependencyException actualServiceException = await Assert.ThrowsAsync<RoleDependencyException>(
        () => this.roleService.RoleByIdAsync(someRoleId).AsTask());

    actualServiceException.Should().BeEquivalentTo(expectedRoleDependencyException);

    await this.dataBrokerMock.Received(1).SelectRoleByIdAsync(Arg.Any<Guid>());

    this.dataBrokerMock.ClearReceivedCalls();
}

在那里,我直接等待

ValueTask
,而不将其存储在变量中。但这也不是我的解决方案。我该如何解决这个问题?

c# .net async-await sonarqube valuetask
1个回答
1
投票

在方法末尾添加

.AsTask()

this.dataBrokerMock.SelectRoleByIdAsync(Arg.Any<Guid>()).AsTask().Throws(npgsqlException);

https://rules.sonarsource.com/csharp/RSPEC-5034/

© www.soinside.com 2019 - 2024. All rights reserved.