Ios 当我忘记设置委托时,如何在Swift中解决测试问题?
背景:我正在同时学习Swift和TDD,以达到自我完善的目的,并试图跟上当前的技术。这个问题,我不是说它是一个bug,让我挠头了一段时间。它以通过测试的XML解析操作为中心,而测试不应该通过,因为没有设置委托,因此不起作用 以下是感兴趣的类别:Ios 当我忘记设置委托时,如何在Swift中解决测试问题?,ios,swift,unit-testing,delegates,nsoperation,Ios,Swift,Unit Testing,Delegates,Nsoperation,背景:我正在同时学习Swift和TDD,以达到自我完善的目的,并试图跟上当前的技术。这个问题,我不是说它是一个bug,让我挠头了一段时间。它以通过测试的XML解析操作为中心,而测试不应该通过,因为没有设置委托,因此不起作用 以下是感兴趣的类别: class ParseOperation: NSOperation, NSXMLParserDelegate { private var parser: NSXMLParser? var dataToParse: NSData?
class ParseOperation: NSOperation, NSXMLParserDelegate {
private var parser: NSXMLParser?
var dataToParse: NSData?
private var parseResults: AnyObject?
private var parseError: NSError?
override func main() {
if let data = dataToParse {
parser = NSXMLParser(data: data)
// neglecting to set the delegate of the parser as self does not cause the test to fail
// parser?.delegate = self
parser?.parse()
}
}
func getParseResults() -> AnyObject? { return parseResults }
func getParseError() -> NSError? { return parseError }
func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
// do parsing stuff
parseResults = NSObject()
}
func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) {
self.parseError = parseError
}
}
这里我有一个最小的XML解析设置。通过忽略设置解析器的委托,将不会调用任何NSXMLParseDelegate
class Manager: NSObject {
func parseSomeXMLInAQueue(completion:(results: AnyObject?, error: NSError?) -> ()) {
let operation: ParseOperation = {
var tempParseOp = ParseOperation()
tempParseOp.dataToParse = "<?xml version=\"1.0\"?><a/>".dataUsingEncoding(NSUTF8StringEncoding)
tempParseOp.completionBlock = {
completion(results: tempParseOp.getParseResults(), error: tempParseOp.getParseError())
}
tempParseOp.qualityOfService = .UserInitiated
tempParseOp.queuePriority = .Normal
return tempParseOp
}()
let queue = NSOperationQueue()
queue.addOperation(operation)
}
}
而且,由于results对象为nil,该测试应该失败,但由于某些原因它成功了
在XCTAssertNotNil上设置断点会导致各种有趣的结果。首先,在断点被命中后继续给出SIGABRT信号。然后,再次继续,返回到我们的线程,并让测试通过。有什么好处
class Test: XCTestCase {
func testParserParsesGoodXMLData() {
let expectation = expectationWithDescription("parser should execute closure")
let manager = Manager()
manager.parseSomeXMLInAQueue { results, error in
// so, the block is called, fulfill the expection immediately so we don't timeout
expectation?.fulfill()
if let someError = error {
XCTFail("Got an error")
}
// now test that our parsing was successful
XCTAssertNotNil(results, "Should get some object from parser")
}
waitForExpectationsWithTimeout(1, handler: nil)
}
}