gpt4 book ai didi

c# - NSubstitute - 收到异步 - “call is not awaited” 警告

转载 作者:IT王子 更新时间:2023-10-29 04:30:50 24 4
gpt4 key购买 nike

我正在尝试验证是否使用正确的参数调用了异步方法。但是,我收到警告:

“由于未等待此调用,因此在调用完成之前继续执行当前方法。考虑将‘await’运算符应用于调用结果”。此警告出现在 //Assert 注释下方的代码行中(如下)。

我使用 NSubstitute 的测试如下:

[Test]
public async Task SimpleTests()
{
//Arrange
var request = CreateUpdateItemRequest();

databaseHelperSub.ExecuteProcAsync(Arg.Any<DatabaseParams>()).Returns(Task.FromResult((object)null));

//Act
await underTest.ExecuteAsync(request);

//Assert
databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2"));
}

被测单元 underTest.ExecuteAsync(request) 调用 ExecuteProcedureAsync 并执行等待:

var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);

由于使用 NSubstitute,在执行被测单元后需要 Received()。而在 RhinoMocks 中,您可以期望在执行被测单元之前发生调用。 RhinoMocks 可以返回 Task.FromResult() 而 NSubstitute 不能。

有效的 RhinoMocks 等价物是这样的:

[Test]
public async Task SimpleTest()
{
// Arrange
var request = new UpdateItemRequest();

databaseHelperMock.Expect(m => m.ExecuteProcAsync(Arg<DatabaseParams>.Matches(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2
))).Return(Task.FromResult<object>(null));

// Act
await underTest.ExecuteAsync(request);

}

我看到有一个解决方法,您可以添加一个扩展方法来解决这个问题:

  public static class TestHelper
{
public static void IgnoreAwait(this Task task)
{

}
}

这意味着我的 NSubstitute 测试行可以按如下方式执行并且警告消失:

databaseHelperSub.Received().ExecuteProcAsync(Arg.Is<DatabaseParams>(
p => p.StoredProcName == StoredProcedureName
&& p.Parameters[0].ParameterName == "Param1"
&& p.Parameters[0].Value.ToString() == "Value1"
&& p.Parameters[1].ParameterName == "Param2"
&& p.Parameters[1].Value.ToString() == "Value2")).IgnoreAwait();
}

但是,我认为一定有更好的解决方案吗?

最佳答案

只要更新到 1.9.0 或更高版本,您就可以使用 await 而不会收到 NullReferenceException

关于c# - NSubstitute - 收到异步 - “call is not awaited” 警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com