更新3/23/2016我刚刚测试了下面的原始示例代码,它在XCode 7.3中编译得很好.看起来像XCTAssertNil一直在更新以获取类型的表达式() throws -> Any?因此可能不再需要这个问题和答案(除了旧版本的编译器一段时间.)
我正在使用XCTest在XCode中编写我的第一个单元测试.我不确定如何利用XCTAssertNil,因为它似乎只在使用某些类型时编译.它似乎可以使用由类和内置基元构成的选项,但不适用于结构.如何使用这种方法呢?
对于结构,编译器会给出以下错误(假设'SimpleStruct'是您的类型的名称):
'SimpleStruct' is not identical to 'AnyObject'
Run Code Online (Sandbox Code Playgroud)
这是一个简单的测试类,用于说明一些编译好的类型和其他不编译的类型.
import Cocoa
import XCTest
struct SimpleStruct {
}
class SimpleClass {
}
class Tests: XCTestCase {
func testl() {
var simpleStruct:SimpleStruct? = nil;
var simpleClass:SimpleClass? = nil;
var i:Int? = nil;
var s:String? = nil;
var tuple:(Int,String)? = nil;
XCTAssertNil(simpleStruct); // compile error
XCTAssertNil(simpleClass); // OK
XCTAssertNil(i); // OK
XCTAssertNil(s); // OK
XCTAssertNil(tuple); // compile error
}
}
Run Code Online (Sandbox Code Playgroud)
Mic*_*lch 12
更新3/23/2016更新了XCode 7.3(但如果您看到我对该问题的编辑,则会显示不再需要此解决方法)
这是一个解决方法.我创建了自己的通用函数:
func AssertNil<T>(@autoclosure expression: () -> T?, message: String = "",
file: StaticString = #file, line: UInt = #line) {
if (expression() != nil) {
XCTFail(message, file:file, line:line)
}
}
Run Code Online (Sandbox Code Playgroud)
似乎不应该这样做.这只是XCTest最初针对Objective-C而没有为Swift更新/桥接的结果吗?
编辑:我已经做了足够的研究,看到AnyObject可以用来表示任何类但不是结构.但是,这并不能解释为什么我的原始帖子中的代码为Int类型和String类型编译.(我在其他地方读到Xcode可能会自动将这些转换为NSNumber和NSString,这可能解释了原因.请参阅http://www.scottlogic.com/blog/2014/09/24/swift-anyobject.html和http:/ /www.drewag.me/posts/swift-s-weird-handling-of-basic-value-types-and-anyobject.我会尝试删除导入基础的Cocoa导入,看看会发生什么)
Edit2:XCTest也导入了Foundation,所以我无法测试我想要的东西.我可以创建自己的方法并测试它.现在,我假设自动转换是允许int和string选项编译的.看起来XCTest还没有为Swift的黄金时间做好准备.
2015年8月13日更新:编辑该功能以与XCode 7 beta兼容
| 归档时间: |
|
| 查看次数: |
3102 次 |
| 最近记录: |