我想实现一个ValueObjectSharedExampleConfiguration: QuickConfigurationusing Quick。
class ValueObjectSharedExampleConf: QuickConfiguration {
override class func configure(_ configuration: Configuration) {
sharedExamples("Value Object") {
(context: @escaping SharedExampleContext) in
describe("same objects") {
it("should be equal") {
let obj1a = context()["1a"]
let obj1b = context()["1b"]
expect(obj1a == obj1b).to(beTrue())
}
}
describe("different objects") {
it("should not be equal") {
let obj1 = context()["1a"]
let obj2 = context()["2"]
expect(obj1 == obj2).to(beFalse())
}
}
}
}
}
然后我想测试任何符合Equatable这个共享示例的类/结构,如下所示:
itBehavesLike("Value Object") { [ "obj1a": foo1a, "obj1b": foo1b, "obj2": foo2] }
但问题是,SharedExampleContext实际上是闭包返回[String: Any],所以obj1a,我在闭包中得到obj1b的obj2变量sharedExample都是类型Any,不一定符合Equatable。因此代码obj1a == obj1b无法编译。
实际上,如果我检查obj1a is Equatable它返回true。但我不知道如何将其转换为编译器可以接受的正确类型。obj1a as! Equatable不会编译,因为Equatable它是一个通用协议。
我不能只写obj1a as! Foo,因为如果有另一个课程Bar: Equatable我想要我的 sharedExample 也适用于此。
这里的主要问题是:我有两个变量转换为Any,它们保证最初是符合Equatable. 在不知道它们的实际类型的情况下,我应该如何合法地比较这两个变量?