我正在尝试对以下 ASP.NET C# 代码进行单元测试:
public override async Task<(IEnumerable<dynamic>, int)> ExecuteQueryWithCount (string query)
{
using (IDbConnection sfConn = new SnowflakeDbConnection())
{
sfConn.ConnectionString = _settings.SnowflakeConnString;
IEnumerable<dynamic> data = new List<dynamic>();
try
{
sfConn.Open();
data = new List<dynamic>();
int count = -1;
data = _dapperWrapper.Query<dynamic>(sfConn, query, commandTimeout: _settings.SnowflakeQueryExecuteTimeout).ToList();
count = data.Count();
return (data, count);
}
catch (Exception e)
{
_logger.LogError(e, $"Error executing query");
throw;
}
finally
{
sfConn.Close();
}
}
}
我有以下单元测试:
public RepositoryTests()
{
var configuration = new ConfigurationBuilder()
.AddUserSecrets<Settings>()
.Build();
_connectionString = configuration.GetValue<string>("SnowflakeConnString");
_dapperWrapperMock = new Mock<IDapperWrapper>();
_loggerMock = new Mock<ILogger<SnowFlakeProvider>>();
_settings = Options.Create(new Settings
{
SnowflakeConnString = _connectionString,
SnowflakeQueryTimeout = 180,
SnowflakeQuerySizeLimit = 2000000,
});
}
[Fact]
public async Task ExecuteQueryWithCount_WithValidParameters_ReturnsResultFromQuery()
{
//arrange
var expectedData = GetData();
var expectedCount = GetData().Count;
string sql = $"SELECT * FROM table;";
_dapperWrapperMock.Setup(t => t.Query<dynamic>(It.Is<IDbConnection>(db => db.ConnectionString == _settings.Value.SnowflakeConnString), sql, It.IsAny<int>()))
//_dapperWrapperMock.Setup(t => t.Query<dynamic>(It.IsAny<IDbConnection>(), sql, It.IsAny<int>()))
//_dapperWrapperMock.Setup(t => t.Query<dynamic>(mockConnection.Object, sql, It.IsAny<int>()))
//_dapperWrapperMock.Setup(x => x.Query<dynamic>(It.IsAny<IDbConnection>(), sql, _settings.Value.SnowflakeQueryTimeout + 5))
.Returns(expectedData);
var snowFlakeProvider = new SnowFlakeProvider(_loggerMock.Object, _settings, _dapperWrapperMock.Object);
//act
var datasets = await snowFlakeProvider.ExecuteQueryWithCount(sql);
//assert
var expectedDatasetsStr = JsonConvert.SerializeObject(expectedData);
var datasetsStr = JsonConvert.SerializeObject(datasets.Item1.Take(3));
Assert.Equal(expectedDatasetsStr, datasetsStr);
}
如何在不实际连接到 Snowflake 数据库的情况下使用 Moq 和 xUnit 进行单元测试? 在我的单元测试构造函数中,我不想为我的 _settings.SnowflakeConnString 使用真实的连接字符串。
我不能直接模拟像 .Query() 这样的 Dapper 扩展方法,所以我创建了一个包装器接口 (_dapperWrapper) 来包装我的扩展方法,以便我可以模拟它们。
但是,当我在单元测试中清空 Snowflake 连接字符串时,出现错误:
Snowflake.Data.Client.SnowflakeDbException : Required property ACCOUNT is not provided.
如何在不实际连接到 Snowflake 数据库的情况下创建单元测试?单元测试一直失败,因为它们要求我输入有效的 Snowflake 连接字符串。