如何测试 Haskell 中的错误?

2023-11-27

我希望能够确保函数在接收到无效值时会抛出错误。例如,假设我有一个仅返回正数的函数 pos:

pos :: Int -> Int
pos x
   | x >= 0 = x
   | otherwise = error "Invalid Input"

这是一个简单的例子,但我希望你能明白。

我希望能够编写一个测试用例,该测试用例会出现错误并认为它是通过测试。例如:

tests = [pos 1 == 1, assertError pos (-1), pos 2 == 2, assertError pos (-2)]
runTests = all (== True) tests

[我的解决方案]

这就是我根据@hammar 的评论最终得出的结论。

instance Eq ErrorCall where
    x == y = (show x) == (show y)

assertException :: (Exception e, Eq e) => e -> IO a -> IO ()
assertException ex action =
    handleJust isWanted (const $ return ()) $ do
        action
        assertFailure $ "Expected exception: " ++ show ex
  where isWanted = guard . (== ex) 

assertError ex f = 
    TestCase $ assertException (ErrorCall ex) $ evaluate f

tests = TestList [ (pos 0) ~?= 0
                 , (pos 1) ~?= 1
                 , assertError "Invalid Input" (pos (-1))
                 ]   

main = runTestTT tests

OP 的解决方案定义assertException,但看起来像Test.HUnit.Tools.assertRaises from testpack这里也可以使用。

我添加了msg论证assertError匹配如何assertRaises有效,并且包含选择性导入,这样像我这样的菜鸟就可以了解常用的东西是从哪里导入的。

import Control.Exception (ErrorCall(ErrorCall), evaluate)
import Test.HUnit.Base  ((~?=), Test(TestCase, TestList))
import Test.HUnit.Text (runTestTT)
import Test.HUnit.Tools (assertRaises)

pos :: Int -> Int
pos x
   | x >= 0 = x
   | otherwise = error "Invalid Input"

instance Eq ErrorCall where
    x == y = (show x) == (show y)

assertError msg ex f = 
    TestCase $ assertRaises msg (ErrorCall ex) $ evaluate f

tests = TestList [
  (pos 0) ~?= 0
  , (pos 1) ~?= 1
  , assertError "Negative argument raises an error" "Invalid Input" (pos (-1))
  ]   

main = runTestTT tests
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何测试 Haskell 中的错误? 的相关文章

随机推荐

  • 如何检查使用了哪个segue

    我有两个 segue 导致相同的结果viewController 有 2 个按钮连接到同一个viewController使用2个segue 在那里面viewController我需要检查点击了哪个按钮 所以实际上我需要检查使用 执行了哪个s
  • 谷歌文档脚本中的“有必要分离元素”错误

    当我尝试将段落从一个文档复制到另一个文档时 出现意外错误 需要分离元件 这是什么意思 我究竟做错了什么 function test copy paragrahps var final final var doc1 get doc final
  • 使用 Google OpenID 进行 Android 身份验证。接下来是什么?

    我不是程序员 但我需要自己做这件事 我需要一些帮助 我这两天一直在寻找解决方案 但没有找到 好的 我正在编写 Android 本机应用程序 我的第一个目标是实现通过Google帐户 已在手机上设置 登录的可能性 所以我使用 AccountM
  • 计算数组中的反转次数

    我正在设计一种算法来执行以下操作 给定数组A 1 n 对于每一个i lt j 找到所有反演对 使得A i gt A j 我正在使用合并排序并将数组 A 复制到数组 B 然后比较这两个数组 但我很难了解如何使用它来查找反转数 任何提示或帮助将
  • 在 pyqt 小部件中实现 pyqtgraph 多处理

    我正在尝试在我用 Python 设计的 GUI 上绘制图像 完整的程序将从相机收集图像数据 然后在 GUI 上显示图像 我已经探索过使用 matplotlib 但它对于我的应用程序来说太慢了 我需要绘图相当快地更新 最好是与我从相机获取的速
  • 如何禁用 Ruby on Rails 应用程序中的所有 form_for 输入字段?

    我正在尝试让我的 Rails 应用程序变得干燥一些 所以我想在我的应用程序中渲染一个表单show查看但是disable所有输入字段 show html erb 最好的方法是什么 谢谢你的帮助 JavaScript 一种方法是使用 JS 来完
  • 有没有办法在多个特征上实现一个特征?

    为什么这不起作用 trait Update fn update mut self trait A trait B impl
  • 如何使用 Google Maps ios SDK 跟踪用户位置并显示行进路径

    我目前正在构建一个ios应用程序 我希望实现一个功能 其中用户的位置显示在Google地图视图上 并且当他们移动折线时显示用户迄今为止走过的路径 这显然需要实时发生 到目前为止 我已经初始化了 Google 地图视图 并且可以使用观察Key
  • URL 不带 .aspx 扩展名

    我注意到很多 ASP Net 站点没有以 aspx 结尾的 URL 一个例子是 https stackoverflow com questions 他们是否创建了一个 Questions 文件夹并将 Default aspx 放入其中 在这
  • 设置 Spring JPA 项目以在 MVC 项目中使用 - 创建 bean 时出错

    我在 eclipse 中开发了一个 Spring JPA 项目 它可以访问存储在 mysql 服务器中的数据 现在我需要将这个项目导入到 Spring MVC 项目中 所以 我在JPA项目的构建路径中配置导出maven依赖项 我将项目添加到
  • 将值从 HTML 传递到 SCSS

    我是 SCSS 的新手 不太确定如何使用它 我已经在 SO 和其他地方寻找解决方案 但找不到 我正在开发一个显示手机列表的应用程序 我通过调用 REST API 获取此列表 以 JSON 形式 所有手机都显示相同类型的信息 例如名称 型号
  • 如何使TabPages可拖动?

    我想让用户通过拖放来重新排列 TabPages 顺序 此外 如果用户能够将 TabPages 从一个 TabControl 拖动到另一个 TabControl 那就太酷了 两种方式都与 Firefox 和 Total Commander 类
  • 将 List[Either[A, B]] 转换为 Either[List[A], List[B]]

    如何转换List Either String Int to Either List String List Int 使用类似于猫的方法sequence 例如 xs sequence在下面的代码中 import cats implicits
  • 对月份(带字符串)排序算法

    我有这个月的数组 January March December October 我想把它排序如下 January March October December 我目前正在思考 如果 否则 可怕的级联 但我想知道是否还有其他方法可以做到这一点
  • 将 strsplit 应用于 data.frame 中的特定列

    我有一个包含分类信息的大型数据框 这是一个例子 gt d lt data frame x c 1 2 3 4 classification c cl1 scl1 cl2 cl3 bla cl4 subclass2 gt d x classi
  • onClick 事件未触发 |安卓

    我制作了一个非常简单的测试应用程序 其中包含一项活动和一种布局 这onClick第一次按下时不会触发 正如它应该的那样 活动 package com example mytest import android os Bundle impor
  • 无法 docker pull - 连接被拒绝

    我正在 ubuntu virtualbox 中从 docker 运行以下命令 并收到连接被拒绝错误 我位于公司代理后面 并配置了环境变量以使用代理以及用户名和密码 我还尝试使用代理链 root mbak1 VirtualBox sudo p
  • 有没有办法在 JSP 中填充地图?

    例如
  • 什么是“此处需要”错误

    它位于我的 Eclipse Problems 视图中 代码编译正常 但出现错误 required from here 指向一些 boost 头文件和行state data const current state interlocked co
  • 如何测试 Haskell 中的错误?

    我希望能够确保函数在接收到无效值时会抛出错误 例如 假设我有一个仅返回正数的函数 pos pos Int gt Int pos x x gt 0 x otherwise error Invalid Input 这是一个简单的例子 但我希望你