我正在尝试测试来自F#函数的返回结果是否与预期的受歧视的联合情况相匹配。我使用NUnit创建测试,它不喜欢区分的联合类型作为TestCase参数。以下测试用例无法编译:
[<TestCase("RF000123", Iccm.CallType.Request)>]
let ``callTypeFromCallNumber returns expected call type``
callNumber callType =
test <@ Iccm.callTypeFromCallNumber callNumber = callType @>我希望这是NUnit的一个限制,但我不完全确定。我有一个想法来解决这个问题,我会把它作为我的答案,但是一个更优雅的解决方案会很好。
如何使用受歧视的联合案例作为测试用例属性参数?
发布于 2015-10-27 06:43:11
这不是NUnit的限制,而是F#语言(以及C#和VB)的限制:您只能将常量放入属性中,而不能将常量放入对象中。区分联合编译为IL中的对象,因此不能将它们放入属性中。
不过,您可以将枚举放入属性中,因为它们是常量(它们是运行时的数字)。
从OP的示例来看,CallType歧视联合似乎没有关联的数据,因此可以考虑将设计更改为一个明灯:
type CallType =
| Request = 0
| Incident = 1
| ChangeManagement = 2
| Unknown = 3然而,你应该意识到,这使得CallType成为一个枚举;它不再是一个受歧视的工会。不过,它应该允许您在属性中使用这些值。
发布于 2015-10-27 01:17:06
这是我解决这个问题的办法。它工作得很好,虽然我觉得它有点移位。我只使用字符串代替类型,然后使用模式匹配来转换为断言中的实际类型。
[<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 @>https://stackoverflow.com/questions/33358350
复制相似问题