我有以下方法,并希望为其中所需的功能(包括ExecuteReaderAsync)编写shim:
public async Task<IEnumerable<ApplicationSetting>> LoadSettingsAsync(string[] keys)
{
await using var sourceConnection = new SqlConnection(_options.Value.StoreConnectionString);
await sourceConnection.OpenAsync();
SqlCommand command =
new SqlCommand(
SqlStatements.SelectMultipleKeys(_options.Value.DefaultStoreTableName,
_options.Value.DefaultStoreSchema), sourceConnection);
command.AddArrayParameters(ColumnNames.Keys, keys);
var reader = await command.ExecuteReaderAsync();
List<ApplicationSetting> settings = new();
while (await reader.ReadAsync())
settings.Add(new ApplicationSetting(reader[ColumnNames.Key].ToString()!,
reader[ColumnNames.Value].ToString(), reader[ColumnNames.Type].ToString()!));
await reader.CloseAsync();
await sourceConnection.CloseAsync();
return settings;
}测试方法:
[Fact]
public async Task LoadSettingsAsync_WhenCall_LoadApplicationSettings()
{
using (ShimsContext.Create())
{
// Arrange
var keys = new string[] { "key1", "key2" };
// simulate a connection
ShimSqlConnection.AllInstances.OpenAsyncCancellationToken = (connection, token) =>
{
return Task.FromResult(true);
};
//string commandText;
// shim-Mock all called methods
ShimSqlCommand.AllInstances.ExecuteReaderAsync = command =>
{
return Task.FromResult(???????????????????????);
};
var rowCounter = 0;
ShimSqlDataReader.AllInstances.Read = (sender) =>
{
rowCounter++;
return rowCounter <= 2;
};
ShimSqlConnection.AllInstances.Close = connection => { };
// Act
var ex = await Record.ExceptionAsync(() =>
_myClass.LoadSettingsAsync(keys));
// Assert
ex.Should().BeNull();
}
} 我尝试Substitute.For<SqlDataReader>()来创建实例SqlDataReader,但是它抛出了System.InvalidOperationException
然后我尝试了这个代码:
ShimSqlCommand.AllInstances.ExecuteReaderAsync = async command =>
{
return new ShimSqlDataReader();
};但是它会在NullReferenceException行上抛出await reader.ReadAsync() (注意:阅读器有价值):

发布于 2022-09-08 09:46:30
以下是我所做的:
ShimSqlCommand.AllInstances.ExecuteReaderAsync = command => Task.FromResult((SqlDataReader)new ShimSqlDataReader());ExecuteReaderAsync需要一个Task<SqlDataReader>作为返回类型。Task.FromResult()用于Task部分。ShimSqlDataReader是来自ShimBase<SqlDataReader>的派生类,您可以将它转换为SqlDataReader,而不存在任何问题。这个类包含在你不需要自己创建的赝品中。
注意:ShimSqlDataReader可以像这样直接使用:
ShimSqlCommand.AllInstances.ExecuteReader = command => new ShimSqlDataReader();对于一个ExecuteReader垫片(没有async)。
https://sqa.stackexchange.com/questions/49175
复制相似问题