我正在尝试测试 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 的限制,但我不完全确定。我有一个想法来解决这个问题,我将其作为我的答案发布,但更优雅的解决方案会很好。
如何使用可区分的联合案例作为测试案例属性参数?
这不是 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了一个枚举;它不再是一个歧视联盟。不过,它应该使您能够使用属性中的值。