首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用F#区分的联合类型作为TestCase属性参数?

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

Stack Overflow用户
提问于 2015-10-27 01:09:35
回答 2查看 385关注 0票数 6

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

代码语言:javascript
复制
[<TestCase("RF000123", Iccm.CallType.Request)>]
let ``callTypeFromCallNumber returns expected call type``
    callNumber callType =
    test <@ Iccm.callTypeFromCallNumber callNumber = callType @>

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

如何使用受歧视的联合案例作为测试用例属性参数?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-27 06:43:11

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

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

从OP的示例来看,CallType歧视联合似乎没有关联的数据,因此可以考虑将设计更改为一个明灯

代码语言:javascript
复制
type CallType =
    | Request = 0
    | Incident = 1
    | ChangeManagement = 2
    | Unknown = 3

然而,你应该意识到,这使得CallType成为一个枚举;它不再是一个受歧视的工会。不过,它应该允许您在属性中使用这些值。

票数 7
EN

Stack Overflow用户

发布于 2015-10-27 01:17:06

这是我解决这个问题的办法。它工作得很好,虽然我觉得它有点移位。我只使用字符串代替类型,然后使用模式匹配来转换为断言中的实际类型。

代码语言:javascript
复制
[<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 @>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33358350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档