微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用来自 Tasty 的 Warp 的“testWithApplication”

如何解决使用来自 Tasty 的 Warp 的“testWithApplication”

Tasty 只有 withResource 函数来管理测试中的资源。

函数将资源初始化和清理函数作为参数:

withResource :: IO a -> (a -> IO ()) -> TestTree -> TestTree

我正在尝试测试 Servant 应用程序,因此我想对每个仆人的 Warp.testWithApplication 使用 testing tutorial,但这是一个 with* 样式的函数一个调用您的操作并为您管理资源的),即类型为:

testWithApplication :: IO Application -> (Port -> IO a) -> IO a

我是不是遗漏了什么,还是因为我没有初始化器/清理函数而是一个包装器 with... 函数,所以很难将两者粘合在一起?

注意

我知道我可以用 testWithApplication(在 main 中)包装整个测试套件,但我更希望 API 仅针对需要它的 TestTree 启动。

解决方法

我知道我可以用 testWithApplication(在 main 中)包装整个测试套件,但我更喜欢 API 是否只为需要它的 TestTree 启动。

是的,所以有两种不同的方法可以实现这一点。

链接教程使用 Hspec 的 aroundstart and stop 您的应用程序用于每个单独的测试。

Tasty 没有为此用例提供单独的实用程序,因为自己动手做起来相当简单:只需在每个 testWithApplication 内调用 testCase(或者您可以为 testCase 的组合定义别名) {1}} 和 testWithApplication 为您节省一些输入)。但是,如果您对同一个应用程序有多个测试,您可能会认为为每个单独的测试启动和停止它有点浪费。

这就是美味的 withResource 的用武之地。当您使用它时,应用会在第一次需要它的测试之前启动,并在最后一次此类测试之后停止。

但这在很大程度上依赖于资源的动态范围——即我们事先不知道资源将按什么顺序分配或取消分配。 (如果您将执行测试套件视为遍历测试树并按顺序运行所有测试,这可能看起来令人惊讶。但由于并行测试执行和测试之间的依赖关系,实际情况更加复杂,因此实际执行顺序可以是任意的。 )

动态作用域与“with”风格的函数不兼容,后者通常只创建嵌套的、类似堆栈的作用域。

所以你的选择是:

  1. 在顶层启动一个应用,并让它在整个测试套件期间运行(您在问题中描述的)。
  2. 在底层(即在每个 testCase 内)启动和停止应用,这是链接教程对 Hspec 所做的。
  3. 不要使用 testWithApplication,而是编写单独的函数来启动和停止应用程序。与单独的获取/释放函数相比,testWithApplication 的吸引力在于它会为您处理异常并确保释放操作将运行,但美味已经解决了这一点。
  4. 最后,我在 Decompose ContT 中描述了一个技巧,它使用线程通过“with”风格的函数(相当于 ContT 值)来实现动态作用域。如果将 testWithApplication 分解为单独的获取/释放操作太麻烦,这可能是最实用的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。