swift 中的嵌套函数选择器用于测试
Nested function selector in swift for testing
这是我的情况,也许有更简单的方法:
我正在测试一些使用通知的东西,我不想将我的期望定义为 class 级可选变量,所以我想知道是否可以将它们设为函数的局部变量这样我的通知处理程序就可以访问它们。
我的尝试是让通知处理程序函数作为我的顶级测试函数中的嵌套函数 - 但我 运行 遇到了选择器命名问题,因为我不确定我需要告诉通知处理程序什么打电话
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) 我如何正确命名选择器以便可以找到它?
问题是你是这样说的:
nc.addObserver(self, selector: "newHandler:" ...
但是 self
,FilePlayerTests class,没有名为 newHandler:
的选择器 - 因为您只将该函数定义为 testFilePlayback
函数中的局部函数。它仅存在于本地 - 仅在 testFilePlayback
函数内部运行的代码看来 - 并且只是非常暂时的,即 testFilePlayback
是 运行.
您必须在 FilePlayerTests class 的顶层定义 newHandler:
,以便它是通知中心实际可以调用的 方法。
当然,这可能(即将会)意味着您还必须将方法中的其他一些内容提升到顶层。
这是我的情况,也许有更简单的方法:
我正在测试一些使用通知的东西,我不想将我的期望定义为 class 级可选变量,所以我想知道是否可以将它们设为函数的局部变量这样我的通知处理程序就可以访问它们。
我的尝试是让通知处理程序函数作为我的顶级测试函数中的嵌套函数 - 但我 运行 遇到了选择器命名问题,因为我不确定我需要告诉通知处理程序什么打电话
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) 我如何正确命名选择器以便可以找到它?
问题是你是这样说的:
nc.addObserver(self, selector: "newHandler:" ...
但是 self
,FilePlayerTests class,没有名为 newHandler:
的选择器 - 因为您只将该函数定义为 testFilePlayback
函数中的局部函数。它仅存在于本地 - 仅在 testFilePlayback
函数内部运行的代码看来 - 并且只是非常暂时的,即 testFilePlayback
是 运行.
您必须在 FilePlayerTests class 的顶层定义 newHandler:
,以便它是通知中心实际可以调用的 方法。
当然,这可能(即将会)意味着您还必须将方法中的其他一些内容提升到顶层。