Ios 当我忘记设置委托时,如何在Swift中解决测试问题?

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?

背景:我正在同时学习Swift和TDD,以达到自我完善的目的,并试图跟上当前的技术。这个问题,我不是说它是一个bug,让我挠头了一段时间。它以通过测试的XML解析操作为中心,而测试不应该通过,因为没有设置委托,因此不起作用

以下是感兴趣的类别:

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