2016-03-10 9 views
1

У меня есть случай тестирования в Swift пытается ждать изменения свойств: неkeyValueObservingExpectationForObject обработчик блок не называется

import XCTest 

class AsynchronyousKVOTests: XCTestCase { 

    let testedObject : TestedObjet = TestedObjet.init() 

    func testKeyValueObservingExpectationForObject() { 

     // 1st approach, fails: 
     keyValueObservingExpectationForObject(self.testedObject, keyPath: "testedProperty") { object, changes in 

      return true // Breakpoint never reached! 
     } 

     // 2nd approach, also fails: 
     keyValueObservingExpectationForObject(self.testedObject, keyPath: "testedProperty", expectedValue: "After") 

     self.testedObject.updateTestedPropertyAsynchronyously("After") 
     // Expectation not fullfilled 
     waitForExpectationsWithTimeout(2, handler: nil) 
    } 
} 

class TestedObjet : NSObject { 

    var testedProperty : NSString = "Before" 

    func updateTestedPropertyAsynchronyously(value: NSString) { 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
      sleep(1) 
      dispatch_sync(dispatch_get_main_queue(), { 
       self.testedProperty = value 
     }) 
     }) 
    } 

} 

testKeyValueObservingExpectationForObject Почему блок обработчик не вызывается?

enter image description here

ответ

1

Вы должны включить ключевое наблюдение значения в Swift с dynamic ключевым словом:

dynamic var testedProperty: NSString = "Before" 
+0

Интересно, что свойства Objective-C не требуют 'динамичного»ключевым слово'. – Lukasz

+1

Я подозреваю, что быть наблюдаемым дорого (перезаписывает набор и получает). Поэтому сделать его явным - это хорошо для производительности. –