使用单元测试框架,
var car: IVehicle = Vehicle.getInstance("mycar") //dictionary
XCTAssertNotNil(car, "Expecting instance not null")
没有工作,不确定原因(结果" IVehicle不符合协议AnyObject"编译错误)。
但car as Car
有效:
XCTAssertNotNil(car as Car, "Expecting instance not null")
这没有用,说测试总是如此,不确定我们如何测试协议的一致性?
XCTAssertTrue(car is IVehicle, "Expecting instance implements IVehicle")
答案 0 :(得分:4)
首先,
XCTAssertNotNil(car, "Expecting instance not null")
假设IVehicle
是一个协议,那么您获得的错误是因为这意味着它不是AnyObject
XCTAssertNotNil
所需要的第一个参数({{ 1}}只能表示类,而不是结构或协议)。这可能有点令人沮丧,因为AnyObject
表明它是用于测试选项是否设置为nil,但是你有它。
下一步:
XCTAssertNotNil
这个编译,但它可能没有“工作”......如果XCTAssertNotNil(car as Car, "Expecting instance not null")
不是car
,你将得到运行时异常而不是断言失败。这是因为Car
强制编译器将左手表达式视为右手类型,无论它是否是(假设在至少某些情况下是有效的强制转换 - 如果不可能的话)总之,你会得到一个编译器错误)。如果在运行时它不是有效的强制转换,那么运行时会失败。
如果您不确定,将car as Car
安全地投放到car
的方法是使用Car
。所以这应该给你想要的结果:
as?
如果确实是XCTAssertNotNil(car as? Car, "Expecting instance not null")
,则会生成Some(car)
,如果不是Car
,则会导致nil
正确触发测试断言。
或者你可以写:
XCTAssert(car is Car, "Expecting car to be a Car")
最后,
car is IVehicle
始终为true,因为编译器在编译时知道car变量的类型,并且完全知道它是IVehicle
- 这是它的类型。所以它假设你偶然写了这个,因为它不可能是假的,它告诉你。
答案 1 :(得分:0)
如果您的类是从NSObject继承的,那么您也可以使用以下代码:-
conforms(to aProtocol: Protocol) -> Bool
它返回一个布尔值,该值指示接收者是否符合给定的协议
例如:-
XCTAssertTrue(sut.conforms(to: CXProviderDelegate.self))