测试对象是否实现了协议

时间:2014-12-15 16:56:42

标签: swift

使用单元测试框架,

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")

2 个答案:

答案 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))