如何单元测试使用SqlKata的函数?QueryFactory无法Mock求解
Mock SqlKata 实现单元测试的方案及相关疑问解答
可行的Mock方法
封装适配接口:自己套一层接口,把SqlKata的操作包起来,业务代码只依赖你写的接口,Mock就简单了。比如写个
ISqlExecutor接口,里面定义你业务需要的查询方法,再写一个用QueryFactory实现这个接口的类。举个例子:public interface ISqlExecutor { List<T> GetList<T>(Func<Query, Query> buildQuery); T GetSingle<T>(Func<Query, Query> buildQuery); } public class SqlKataExecutor : ISqlExecutor { private readonly QueryFactory _factory; public SqlKataExecutor(QueryFactory factory) { _factory = factory; } public List<T> GetList<T>(Func<Query, Query> buildQuery) { var query = buildQuery(new Query()); return _factory.Query<T>(query).ToList(); } public T GetSingle<T>(Func<Query, Query> buildQuery) { var query = buildQuery(new Query()); return _factory.Query<T>(query).FirstOrDefault(); } }之后业务层注入
ISqlExecutor,单元测试时直接Mock这个接口,返回你预设的测试数据就行。模拟查询结果而非Mock框架:如果不想加适配层,你可以手动构造
SqlResult,结合内存数据模拟执行。比如先让Query生成SQL,然后自己写逻辑匹配SQL,返回对应的内存数据。这种方式更像模拟数据源,适合简单场景,但复杂查询的话维护成本会高。
为什么SqlKata没做接口/虚方法
SqlKata本身是轻量的SQL构建工具,核心是帮你快速写SQL,不是为了高可测试性设计的。低级别ORM通常更贴近原生SQL,设计上优先考虑简洁和性能,加接口或者把方法设为虚的会增加复杂度,反而违背它轻量的定位。另外,SqlKata的链式API(Where/Select这些)每次调用都会返回新的Query实例,这种不可变设计本身就很难Mock,开发者可能觉得让使用者自己加适配层是更灵活的方案,没必要在库本身做这些兼容。
内容的提问来源于stack exchange,提问作者manymanymore
相关产品推荐
相关产品推荐

