You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Julia:如何Mock LibPQ.Connection对象测试数据库查询函数

解决LibPQ.Connection对象Mock问题

核心思路

不用传入nothing,而是创建一个无效的LibPQ.Connection实例(不会建立真实数据库连接),同时MockLibPQ.execute函数返回预设假数据。既满足原函数的类型要求,又能彻底避免真实数据库调用。

修改后的测试代码

using Test
using Pretend
using LibPQ
using DataFrames

# 补充示例用的MyStruct定义(原代码未给出)
struct MyStruct
    some_string::String
    some_int::Int
end

function function_to_test(conn::LibPQ.Connection)::MyStruct
    sql = "select * from my_table;"
    result = execute(conn, sql)
    # 模拟解析逻辑(适配假数据格式)
    first_row = first(result)
    return MyStruct(first_row["some_string"], first_row["some_int"])
end

Pretend.activate()
@testset verbose = true "Test my function" begin
    @testset "Mock LibPQ.execute" begin
        # 创建无效LibPQ.Connection实例(无真实连接)
        conn = LibPQ.Connection("dbname=fake_db user=fake_user", throw_error=false)
        
        # 标记LibPQ.execute为可Mock
        @mockable LibPQ.execute(conn::LibPQ.Connection, query::String)
        
        # 定义Mock执行逻辑,返回预设假数据
        fake_execute(::LibPQ.Connection, ::String) = [Dict("some_string" => "string", "some_int" => 234)]
        
        apply(execute => fake_execute) do
            result = function_to_test(conn)
            @test typeof(result) == MyStruct
            @test result.some_string == "string"
            @test result.some_int == 234
        end
        
        # 关闭无效连接
        close(conn)
    end
end

关键说明

  • 无效连接创建:通过传入不存在的数据库参数+throw_error=false,得到合法的LibPQ.Connection类型对象,但不会建立真实连接,完美适配原函数的类型约束。
  • Mock逻辑替换:用Pretend标记目标函数后,自定义假执行逻辑返回测试数据,完全隔离真实数据库操作。
  • 测试扩展性:除了检查返回类型,还可验证解析后的字段值,让测试覆盖更全面。

替代方案(无需创建连接实例)

如果不想生成任何LibPQ.Connection实例,可以调整原函数的参数类型为抽象协议:

# 定义抽象连接协议
abstract type DBConnection end
# 包装真实LibPQ连接
struct LibPQWrapper <: DBConnection
    inner_conn::LibPQ.Connection
end
# 修改原函数适配抽象类型
function function_to_test(conn::DBConnection)::MyStruct
    sql = "select * from my_table;"
    result = execute(conn.inner_conn, sql)
    # 解析逻辑...
end

测试时创建模拟的DBConnection实例即可,但这种方式需要修改原函数代码。

内容的提问来源于stack exchange,提问作者CoJump

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 13:55:26