1

这是我的情况,也许有一种更简单的方法可以做到这一点:

我正在测试一些使用通知的东西,我不想将我的期望定义为类级别的可选变量,所以我想知道是否可以让它们成为函数的局部变量,以便通知处理程序可以访问他们。

我的尝试是将通知处理程序函数作为我的顶级测试函数中的嵌套函数 - 但我遇到了选择器命名问题,因为我不确定我需要告诉通知处理程序调用什么

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) 我将如何正确命名选择器以便可以找到它?

4

1 回答 1

1

问题是你这样说:

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

但是self,FilePlayerTests 类没有调用选择器newHandler:- 因为您仅将该函数定义为函数内部的本地testFilePlayback函数。它只存在于本地 - 只存在于testFilePlayback函数内部在它之后运行的代码的眼中 - 并且只是非常暂时的,即在testFilePlayback运行时。

您必须newHandler:在 FilePlayerTests 类的顶层定义,以便它是通知中心可以实际调用的方法。

当然,这可能(即将)意味着您还必须将方法中的其他一些内容提升到顶级水平。

于 2015-04-22T15:30:28.970 回答