如何使用 F# 可区分联合类型作为 TestCase 属性参数?

2024-01-09

我正在尝试测试 F# 函数的返回结果是否与预期的可区分联合案例匹配。我正在使用 NUnit 来创建测试,它不喜欢将受歧视的联合类型作为TestCase范围。以下测试用例无法编译:

[<TestCase("RF000123", Iccm.CallType.Request)>]
let ``callTypeFromCallNumber returns expected call type``
    callNumber callType =
    test <@ Iccm.callTypeFromCallNumber callNumber = callType @>

我预计这是 NUnit 的限制,但我不完全确定。我有一个解决这个问题的想法,我将其作为我的答案发布,但更优雅的解决方案会很好。

如何使用可区分的联合案例作为测试案例属性参数?


这不是 NUnit 的限制,而是 F# 语言(以及 C# 和 VB)的限制:您只能将常量转化为属性,但不是对象。可区分联合编译为 IL 中的对象,因此您不能将它们放入属性中。

You can不过,将枚举放入属性中,因为它们是常量(它们在运行时是数字)。

从OP中的例子来看,它看起来像CallTypeDiscrimed Union没有关联数据,因此可以考虑将设计更改为an enum https://msdn.microsoft.com/en-us/library/dd233216反而:

type CallType =
    | Request = 0
    | Incident = 1
    | ChangeManagement = 2
    | Unknown = 3

不过,你应该意识到,这使得CallType一个枚举;它不再是一个受歧视的联盟。不过,它应该使您能够使用属性中的值。

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

如何使用 F# 可区分联合类型作为 TestCase 属性参数? 的相关文章

  • 继续“F# 中是否存在与 C# 的 nameof(..) 等效的内容?”

    参考F 中是否存在相当于 C 的 nameof 的功能 https stackoverflow com questions 48304398 is there an equivalent of cs nameof in f 在以下情况下如何
  • 对象中的公共可变字段

    是否可以在 F 中创建一个简单的公共可变字段 我正在创建一个将从 C 程序访问的库 并且我需要能够从 C 设置一个字段 C Equivalent public class MyObj public int myVariable F type
  • F# 有异步验证库吗?

    我在代码中经常使用 asyncResult 但它会在第一个错误时退出 asyncResult let a allGood let b thisReturnsError let c neverExecuted 但有时我想执行所有函数并总结错误
  • 不可变数据结构性能

    我不明白作为一个集合的东西怎么可能是不可变的并且仍然具有可接受的性能 根据我在 F Sets 中读到的内容 内部使用红黑树作为其实现 如果每次我们想要向红黑树添加新内容时 我们基本上都必须重新创建它 那么它如何才能具有良好的性能呢 我在这里
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • 绘图 Deedle 框架

    我有以下代码 let mychart frame GetAllSeries gt Seq iter fun key value gt Chart Line value Name key gt Chart Combine where fram
  • 如何搭建Windows Phone开发环境并使用F#开发应用程序?

    我已经下载了Windows Phone开发工具 但我不知道如何使用F 来开发应用程序 目前是C 将 F 和 Windows Phone 模板安装到 Visual Studio 中可以让生活变得更轻松 如果您打开 Visual Studio
  • F# 中序列的递归函数

    这是一个相当微不足道的问题 但快速的谷歌搜索并没有给我答案 为序列编写递归函数的标准方法是什么 对于列表 您可以使用空列表和头 尾模式进行模式匹配 序列的等效项是什么 没有标准的方法可以做到这一点 因为您很少为序列编写递归函数 您应该查看各
  • 我缺少什么:可以使用多个参数进行函数组合吗?

    我了解 F 中函数组合的基础知识 例如所述here http blogs msdn com b chrsmith archive 2008 06 14 function composition aspx 不过 也许我错过了一些东西 这 gt
  • F# 2010 Seq.generate_using

    Visual Studio 2010 中的 Seq generate using 是否有替代 解决方法 FSharp PowerPack dll 不适用于 2010 AFAIK 很抱歉 2010 年的 PowerPack 尚未上市 我不记得
  • 何时在 F# 中使用区分联合与记录类型

    在继续讨论复杂的示例之前 我试图先弄清楚 F 的基础知识 我正在学习的材料介绍了区分联合和记录类型 我已经审阅了两者的材料 但我仍然不清楚为什么我们要使用其中之一而不是另一个 我创建的大多数玩具示例似乎都可以在两者中实现 记录似乎非常接近我
  • ProjectCracker 与 .netstandard 2.0 项目

    我的团队最近从使用 net 框架转向使用 net 标准 2 0 作为我们的 F 库 我们有一些在项目上运行的内部脚本来自动生成 Markdown 文档 这些脚本使用 F 编译器服务 SDK 来分析代码并检索类型元数据 文档注释等 我们正在使
  • 按属性值选择 XML 节点

  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 将属性应用于返回值 - 在 F# 中

    在 C 中 可以将属性应用于方法的返回 return DynamicAttribute public object Xyz return new ExpandoObject 这在 F 中可能吗 背景 我想要一个用 F 编写的库的方法 该方法
  • 将 C# 代码转换为 F#(if 语句)

    我想知道如何转换此代码逐行从 C 到 F 我不想使用任何类型的 F 习惯用法或类似的东西 我想了解如何直接映射C 的构造到 F 这是 C 代码 requires l Length gt 0 int GetMinimumValue List
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 在 F# 类型提供程序中发出生成的类型

    我创建了一个简单的生成类型提供程序 它采用重新组织类型的程序集的路径 将它们置于类型提供程序命名空间下 如果您愿意 可以说是内部化 相关代码的链接在这里https github com colinbull Playground https
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是

随机推荐