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

Mat*_*and 6 f#

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

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

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

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

Mar*_*ann 7

这不是 NUnit 的限制,而是 F# 语言(以及 C# 和 VB)的限制:您只能放置常量放入属性,而不能放入对象。Discriminated Unions 编译为 IL 中的对象,因此您不能将它们放入属性中。

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

从 OP 中的示例来看,CallTypeDiscriminated Union 似乎没有关联数据,因此您可以考虑将设计更改为枚举:

type CallType =
    | Request = 0
    | Incident = 1
    | ChangeManagement = 2
    | Unknown = 3
Run Code Online (Sandbox Code Playgroud)

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