如何使用F#判别联合类型作为TestCase属性参数?

如何使用F#判别联合类型作为TestCase属性参数?,f#,F#,我试图测试F#函数的返回结果是否与预期的有差别的联合情况匹配。我正在使用NUnit创建测试,它不喜欢将区分的联合类型作为TestCase参数。以下测试用例未能编译: [<TestCase("RF000123", Iccm.CallType.Request)>] let ``callTypeFromCallNumber returns expected call type`` callNumber callType = test <@ Iccm.callTypeF

我试图测试F#函数的返回结果是否与预期的有差别的联合情况匹配。我正在使用NUnit创建测试,它不喜欢将区分的联合类型作为
TestCase
参数。以下测试用例未能编译:

[<TestCase("RF000123", Iccm.CallType.Request)>]
let ``callTypeFromCallNumber returns expected call type``
    callNumber callType =
    test <@ Iccm.callTypeFromCallNumber callNumber = callType @>
[]
让``callTypeFromCallNumber返回预期的调用类型``
呼叫号码呼叫类型=
试验
我希望这是NUnit的一个限制,但我不能完全确定。我有一个解决这个问题的想法,我会把它作为我的答案发布,但是一个更优雅的解决方案会更好


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

以下是我解决该问题的方法。虽然我发现它有点像是在变换,但它工作得很好。我只是使用字符串代替类型,然后使用模式匹配将其转换为断言中的实际类型

[<TestCase("RF000123", "Request")>]
[<TestCase("IM000123", "Incident")>]
[<TestCase("CM000123", "ChangeManagement")>]
[<TestCase("AR000123", "Unknown")>]
let ``callTypeFromCallNumber returns expected call type``
    callNumber callType =
    test <@ Iccm.callTypeFromCallNumber callNumber = match callType with
                                                     | "Request" -> Iccm.CallType.Request 
                                                     | "Incident" -> Iccm.CallType.Incident
                                                     | "ChangeManagement" -> Iccm.CallType.ChangeManagement
                                                     | _ -> Iccm.CallType.Unknown @>
[]
[]
[]
[]
让``callTypeFromCallNumber返回预期的调用类型``
呼叫号码呼叫类型=
测试Iccm.CallType.Request
|“事件”->Iccm.CallType.Incident
|“ChangeManagement”->Iccm.CallType.ChangeManagement
|->Iccm.CallType.Unknown@>

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

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

从OP中的例子看,“<代码> CallType <代码>歧视联盟没有关联数据,因此您可以考虑将设计更改为:

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

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