如何在不连接到 Snowflake 数据库的情况下对 Dapper Query 进行单元测试

问题描述 投票:0回答:0

我正在尝试对以下 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 连接字符串。

c# unit-testing asp.net-core snowflake-cloud-data-platform dapper
© www.soinside.com 2019 - 2024. All rights reserved.