如何为 FsCheck 测试生成空字符串

2024-03-20

Using FsCheck https://github.com/fsharp/FsCheck,Haskell QuickCheck 测试库的 F# 版本,用于生成测试C# https://github.com/fsharp/FsCheck/blob/master/FsCheck.CSharpExamples/Program.cs,我发现随机字符串生成器不会生成空字符串。

using FsCheck.Fluent;
Spec.ForAny<string>(s => s != null).QuickCheck(); // always pass

此外,似乎没有设计处理空字符串,但我还没有设法确定它从文档中 https://github.com/fsharp/FsCheck/blob/master/Docs/Documentation.md。例如,仅在两个字符串(其中一个为空)之间进行选择是行不通的:

var strings = Any.ValueIn<string>(null, "non-null string");
Spec.For(strings, s => true).QuickCheck(); // throws null ref exception

字符串似乎是一种特殊情况,因为它处理定制对象,例如

class Thing {}

与空值混合时:

var objects = Any.ValueIn(null, new Thing());
Spec.For(objects, s => true).QuickCheck(); // pass

我试图对此进行深入研究,看来您已经发现了 FsCheck 中的一个错误。

问题似乎出在 Arbitrary.fs 文件中,并且实际上仅与字符串相关。我必须替换它,他们在字符串上调用 ToCharArray

    static member String() = 
        { new Arbitrary<string>() with
            override x.Generator = Gen.map (fun chars -> new String(List.toArray chars)) generate
            override x.Shrinker s = s.ToCharArray() |> Array.toList |> shrink |> Seq.map (fun chars -> new String(List.toArray chars))
        }

有了这个

    static member String() = 
        { new Arbitrary<string>() with
            override x.Generator = Gen.map (fun chars -> new String(List.toArray chars)) generate
            override x.Shrinker s = 
                match s with
                    | null  -> seq {yield null;}
                    | _ -> s.ToCharArray() |> Array.toList |> shrink |> Seq.map (fun chars -> new String(List.toArray chars))
        }

您可能想向 fscheck 开发人员提出这个问题here https://github.com/fsharp/FsCheck/issues并检查我的修复是否运行良好 - 可能有更好的方法来实现它,但对于已经知道代码的人来说会更简单。

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

如何为 FsCheck 测试生成空字符串 的相关文章

随机推荐

  • Jquery:获取页面的所有html源但排除一些#ids

    我正在尝试使用 html 或 contents 但我有奇怪的行为 我基本上需要获取页面的整个 dom 排除一些元素 例如 first second 并将其作为字符串传递 不再是 dom 是否可以 您可以克隆它 删除要从克隆中排除的元素 然后
  • Jetpack compose 的公开下拉菜单

    我想知道是否有针对 jetpack compose 的暴露下拉菜单的解决方案 我在 jetpack compose 中找不到该组件的正确解决方案 有什么帮助吗 The M2 从版本开始1 1 0 alpha06 https develope
  • 我可以在 Django 中使用 HTTP 基本身份验证吗?

    我们有一个在 Apache 上运行的网站 访问该网站有许多通过 HTTP 基本身份验证保护的静态页面 我使用 Django 内置的用户管理支持 用 Django 编写了网站的新部分 我遇到的问题是用户必须通过 HTTP Basic 身份验证
  • 如何使用 cURL 和 PHP 来欺骗引荐来源网址?

    我正在尝试使用 PHP 学习 cURL 来欺骗网站的引荐来源网址 我希望通过以下脚本来完成此任务 但它似乎不起作用 有什么想法 建议我哪里出错了 或者你知道有什么教程可以帮助我解决这个问题吗 Thanks Jessica
  • junit 测试用例生成器

    有没有一个好的工具可以根据一些原始模板自动生成 jUnit 测试用例 这样一来 没有太多 Java 或 jUnit 背景的工程师就可以编写测试用例 作为背景信息 这是用于黑盒测试 如果除了使用 jUnit 之外还有其他替代方法来运行回归测试
  • 在 Jenkins 管道中执行 gcloud 命令

    我尝试在 Jenkins 声明性管道中运行 gcloud 命令 如下例所示 pipeline agent any stages stage Run gcloud version steps sh gcloud version 我下载了 GC
  • Eclipse“增强类反编译器”插件调试时不反编译

    问题描述 查看类 即 Ctrl Shift T 时反编译工作正常 但从调试角度单步执行代码时则不然 而是打开 类文件查看器 使用的版本 Eclipse Oxygen 和增强型类反编译器 3 0 0 这也适用于氧气和更高版本 单击 窗口 gt
  • 在 ExtJS 网格中编辑整行后触发“afteredit”?

    我有一个 ExtJS 编辑器网格 里面有一些列 我想修改记录上的数据并将数据自动保存到数据库 但我只需要在完成编辑当前行的所有单元格后保存数据 我使用了 afteredit 事件 但它在一个单元格更改后立即触发了该事件 在完成所有单元格的修
  • 如何在 IndexPath 处使用 reloadRows 更新行

    我正在尝试使用按钮删除单元格 这是一个单元格的实现 UITableViewCell tableView UITableView tableView cellForRowAtIndexPath NSIndexPath indexPath st
  • Mac OS 10.14 Mojave + qt5.5 + gem capybara-webkit

    我的配置是 MAC Mojave v10 14 我尝试安装需要 qt5 5 的 gem Capybara webkit v 1 15 0 但 qt5 5 已从自制程序中删除 并且与 Xcode v10 不兼容 我试试这个 卸载 Xcode
  • 在 Android 中的 doinbackground() 中执行 UI 任务

    有没有办法在 AsyncTask 的 doinbackground 中执行 UI 任务 我很清楚最好在 onPostExecute 方法中执行此操作 但就我而言 由于我需要使用可重复使用的警报 因此能够访问我的 doinbackground
  • 查找 jQuery 中所有未选中的复选框

    我有一个复选框列表
  • Django,在模型中按函数过滤 Q 对象

    在我的 Profile 模型中 我有以下功能 它用于返回用户的全名 如果某些数据丢失 则返回用户的全名 def full name self first name self user first name strip if first na
  • 像java一样的Visual Studio参数化单元测试

    在 Java 测试环境中 我可以使用参数化单元测试 如以下代码所示 RunWith value Parameterized class public class JunitTest6 private int number public Ju
  • 在后台重新加载 UITableView 的数据

    在我的应用程序中 我有一个 UITableViewController 它的 tableView 分为 3 个部分 我从我的服务器下载每个部分的数据 为此 我有 3 个函数 例如 f1 f2 和 f3 每个更新一个相应的 NSArray 用
  • VS 2022:Roslyn 代码分析的高 RAM 和 CPU 问题

    我们在 Visual Studio 2022 v 17 2 2 64 位 中拥有一个庞大的解决方案 ASP NET MVC C Roslyn 代码分析始终使用高 CPU 和 RAM 有办法防止这个问题吗 配置还是其他 在 Visual St
  • 单击提交按钮时重新加载页面后如何滚动到特定 div?

    我正在尝试做一些奇特的事情 我已经成功编写了代码 以便在填写小表单并单击提交按钮时显示数据库中的结果 结果显示在表单的正下方 但我觉得如果页面能自动向下滚动到包含已填写表单结果的 div 那就太好了 我想我必须使用 jquery 或 aja
  • Angular2 - 将 POST 与 angular-in-memory-web-api 一起使用

    我正在使用 Angular 2 的 angular in memory web api 到目前为止 我只使用了 GET 调用 而且运行良好 我要调用的 API 仅使用 POST 调用 因此我开始将 GET 调用重写为 POST 调用 但随后
  • 如何从 Ruby on Rails 应用程序打印(条形码)标签?

    我在 RoR 中开发的第一个应用程序是针对我们库存中使用的一些 Kiosk 触摸屏 PC 当库存工人拿起一些材料时 他在表格中输入数量 现在我想在我们的 Zebra 打印机上打印一个标签 其中包含 客户名称 材料描述 数量和条形码 我如何从
  • 如何为 FsCheck 测试生成空字符串

    Using FsCheck https github com fsharp FsCheck Haskell QuickCheck 测试库的 F 版本 用于生成测试C https github com fsharp FsCheck blob