2015-04-22 5 views
0

Вот моя ситуация, и, возможно, есть более простой способ сделать это:Уплотненные селектор функций в стриже для тестирования

Я тестирую некоторые вещи, которые используют уведомления, и я не хочу, чтобы определить мои ожидания как необязательные переменные уровня класса, поэтому мне было интересно, могу ли я сделать их локальными переменными для функции таким образом, чтобы мой обработчик уведомлений мог получить к ним доступ.

Моя попытка была сделать функции обработчика уведомлений в виде вложенных функций внутри моей верхней функции тестирования уровня - но я уже столкнулся с проблемами селекторных имен, как я не уверен, что мне нужно сказать, обработчик уведомлений для вызова

class FilePlayerTests: XCTestCase { 

func testFilePlayback() { 


    let f1URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test1", withExtension: "csv")! 
    let f2URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test2", withExtension: "csv")! 
    let f3URL : NSURL = NSBundle(forClass: FilePlayerTests.self).URLForResource("test3", withExtension: "csv")! 

    let f1 = dm.createFilePlayerFromURL(f1URL) 
    let f2 = dm.createFilePlayerFromURL(f2URL) 
    let f3 = dm.createFilePlayerFromURL(f3URL) 


    let e1 = expectationWithDescription("xplane1") 
    let e2 = expectationWithDescription("xplane2") 
    let e3 = expectationWithDescription("xplane3") 



    f1?.startPlayback() 


    //Define LocationMessage Observer 
    nc.addObserver(self, selector: "newHandler:", 
     name: dmNotification.LocationData.rawValue, 
     object: nil) 


    ///Prints out a new Location Message 
    func newHandler(notif: NSNotification) { 
     let msg = notif.asLocationMessage! 
     println(msg) 

     e1.fulfill() 
    } 

} 
} 

Так что мой код падает, потому что он не может найти селектор.

1) Действительно ли это?

2) Как бы правильно назвать селектор, чтобы его можно было найти?

ответ

1

Проблема заключается в том, что вы говорите, это:

nc.addObserver(self, selector: "newHandler:" ... 

Но self класс FilePlayerTests, не имеет селектор не называется newHandler: - потому что вы определили эту функцию только в качестве локальной функции внутри функции testFilePlayback. Он существует только локально - только в глазах кода, который запускается после него внутри функции testFilePlayback, и только очень временно, то есть в то время как testFilePlayback работает.

Вы должны определить newHandler: на верхнем уровне класса FilePlayerTests, так что это метод, который может вызвать центр уведомлений.

Это может означать, что вам, конечно же, придется продвигать некоторые другие вещи в вашем методе на верхний уровень.