Tôi đang cố gắng xác minh rằng một phương thức không đồng bộ được gọi với thông số chính xác. Tuy nhiên, tôi nhận được cảnh báo:NSubstitute - Đã nhận cho không đồng bộ - cảnh báo “cuộc gọi không được chờ đợi”
"Vì cuộc gọi này không được chờ đợi, việc thực hiện phương pháp hiện tại vẫn tiếp tục trước khi cuộc gọi kết thúc. Hãy xem xét áp dụng toán tử" chờ đợi "cho kết quả cuộc gọi". Cảnh báo này xuất hiện trên dòng mã bên dưới chú thích //Assert
(bên dưới).
thử nghiệm của tôi sử dụng NSubstitute là như sau:
[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"));
}
Các đơn vị theo phương pháp kiểm tra underTest.ExecuteAsync(request)
gọi ExecuteProcedureAsync
và thực hiện các công chờ đợi:
var ds = await DatabaseHelper.ExecuteProcAsync(dbParams);
Do thực tế rằng với NSubstitute, các Received() được yêu cầu sau khi thực hiện các đơn vị được kiểm tra. Trong khi ở RhinoMocks, bạn có thể mong đợi để có cuộc gọi xảy ra trước khi thiết bị đang được kiểm tra được thực hiện. RhinoMocks có thể trả về Task.FromResult() trong khi NSubstitute thì không.
Các RhinoMocks tương đương mà làm việc là thế này:
[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);
}
Tôi đã thấy rằng có một cách giải quyết khác, nơi bạn có thể thêm một phương pháp khuyến nông để loại bỏ vấn đề này:
public static class TestHelper
{
public static void IgnoreAwait(this Task task)
{
}
}
Ý nghĩa dòng thử nghiệm của tôi cho NSubstitute có thể được thực hiện như sau và cảnh báo biến mất:
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();
}
Tuy nhiên, tôi cho rằng phải có một giải pháp tốt hơn ngoài kia cho điều này?
Đây là một trình biên dịch * * cảnh báo nói rằng bạn quên đặt một 'await' trước một phương pháp không đồng bộ. Tại sao bạn không đơn giản đặt 'await' vào dòng sau' // Assert'? –
Nếu bạn chờ trước cuộc gọi. Kiểm tra không thành công vì nó nhận được một ngoại lệ tham chiếu null. – JBond
NSubstitute hiện không có cách xử lý tốt hơn. Xem lời giải thích của Jake ở đây: http://stackoverflow.com/a/31021430/906 Có thể đáng để thay đổi NSub, tôi đã tạo ra một vấn đề ở đây: https://github.com/nsubstitute/NSubstitute/issues/190 –