Я пытаюсь проверить, что асинхронный метод вызывается с правильными параметрами. Однако я получаю предупреждение:
"Поскольку этот вызов не ожидается, выполнение текущего метода продолжается до завершения вызова. Рассмотрите возможность применения оператора" ожидание "к результату вызова". Это предупреждение появляется в строке кода под комментарием //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();
}
Однако я предположил, что для этого должно быть лучшее решение?