在我的.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
,而不将其存储在变量中。但这也不是我的解决方案。我该如何解决这个问题?
在方法末尾添加
.AsTask()
。
this.dataBrokerMock.SelectRoleByIdAsync(Arg.Any<Guid>()).AsTask().Throws(npgsqlException);