我正在尝试在 haskell 中编写一些简单的代码,其中有一个函数执行简单的数据库查询。为了使用 HUnit 对 Iam 进行单元测试,但不确定如何模拟数据库连接和查询响应。
问问题
89 次
1 回答
0
将执行数据库查询的函数作为参数传递给您的代码,而不是“硬连线”。在测试期间,将模拟函数传递给代码。在生产中,传递一个真正执行数据库查询的函数。
这个新的函数参数应该处于正确的抽象级别。例如,像
queryDbForClient :: Connection -> SQLString -> ClientId -> IO (Maybe RowData)
可能是个坏主意,因为它仍然迫使被测代码意识到Connection
存在 s 和 SQL 字符串之类的东西。像这样的东西
findClientById :: ClientId -> IO (Maybe Client)
可能会更好,因为这样您就可以自由传递根本不使用特定于 db 的Connection
类型的函数。例如,它们可以由内存中的引用支持。
请注意,您可以通过部分应用程序构建findClientById
并queryDbForClient
稍微映射结果。但这应该是某些设置代码的任务,而不是您要测试的主要代码的任务。
一旦为了可测试性和可配置性而开始以这种方式传递函数,一些常见问题就会开始出现。例如,如果我有多个依赖项怎么办?将它们全部作为位置参数传递是一件苦差事。这可能导致将它们一起传递到函数记录中,可能使用Has
类似类型的类型类,以免将主代码绑定到任何特定记录。
于 2021-10-29T07:38:45.713 回答