繁体   English   中英

Haskell 中的模拟数据库连接

[英]Mock Database connections in haskell

我正在尝试在 haskell 中编写一些简单的代码,其中有一个函数执行简单的数据库查询。 为了对我使用 HUnit 进行单元测试,但不确定如何模拟数据库连接和查询响应。

将执行数据库查询的函数作为参数传递给您的代码,而不是“硬连线”。 在测试期间,将模拟函数传递给代码。 在生产中,传递一个真正执行数据库查询的函数。

这个新的函数参数应该处于正确的抽象级别。 例如,像

queryDbForClient :: Connection -> SQLString -> ClientId -> IO (Maybe RowData)

这可能是一个坏主意,因为它仍然强制被测代码意识到存在Connection和 SQL 字符串之类的东西。 像这样的东西

findClientById :: ClientId -> IO (Maybe Client) 

可能会更好,因为这样您就可以自由传递根本不使用特定于数据库的Connection类型的函数。 例如,它们可以由内存中的引用支持

请注意,您可以通过部分应用程序从queryDbForClient构建findClientById并稍微映射结果。 但这应该是一些设置代码的任务,而不是您要测试的主要代码。


一旦为了可测试性和可配置性开始以这种方式传递函数,一些常见问题就会开始出现。 例如,如果我有多个依赖项怎么办? 将它们全部作为位置参数传递是一件苦差事。 这可能会导致在函数记录中将它们一起传递,可能使用Has类型类,以免将您的主代码绑定到任何特定记录。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM