如何解决XCT断言枚举的情况
我想断言一个值是否是一个特定的枚举案例。
例如,如果我有以下枚举类和一个变量 unknown
:
let value: MyEnum
我想检查 enum MyEnum {
case firstCase(value: Int)
case secondCase
}
是否是 value
的实例。
本质上,我希望能够编写以下内容或类似的内容:
firstCase
我怎样才能做到这一点?我正在寻找一个已经存在的 let value: MyEnum = .firstCase(value: 3)
XCTAssertEnumCase(value,.firstCase)
函数,或者寻找如何自己编写 XCT
的说明。
解决方法
您可以轻松创建适用于特定 enum
的函数,但是,创建适用于任何枚举的通用断言函数将很难实现,因为没有协议/类型约束可以代表任何enum
。您可以将 RawRepresentable
用于具有原始值的枚举,但这不会涵盖所有 enum
,例如您问题中的那个。
这是您特定枚举的函数。
func XCTAssertEnumCase(_ testValue: MyEnum,_ expectedValue: MyEnum) -> Bool {
switch (testValue,expectedValue) {
case (.firstCase,.firstCase):
return true
case (.secondCase,.secondCase):
return true
default:
return false
}
}
或者,您可以使您的枚举符合您的测试目标中的 Equatable
(如果它尚未符合您的实际生产目标)并且只检查您的 Equatable
一致性中的大小写相等性,但是那么您将无法轻松测试“完全相等”(包括相关值)。此外,该解决方案将要求您为您正在测试的所有协议手动实施 Equatable
一致性。
如果不实际提供关联值,则无法实例化具有关联值的枚举案例。所以 XCTAssertEnumCase(value,.firstCase)
无法实现。
您可以执行 XCTAssertEnumCase(testValue,.firstCase(value: 3313)
,您可以将任何 Int
传递给 firstCase
的关联值,只要 testValue
也是 firstCase
, func 将返回 true
,无论关联值如何。
或者,您可以创建单独的函数来断言枚举的每个案例。
extension MyEnum {
func assertFirstCase() -> Bool {
switch self {
case .firstCase:
return true
default:
return false
}
}
func assertSecondCase() -> Bool {
switch self {
case .secondCase:
return true
default:
return false
}
}
}
然后像这样使用它:
let value: MyEnum = .firstCase(value: 3)
value.assertFirstCase() // returns true
value.assertSecondCase() // returns false
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。