[英]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.