2017-05-17 23 views
1

我想將一個Show segue附加到故事板中表格視圖的屬性單元。現在我想測試這個綁定是否存在。即,如果我在Interface Builder中刪除了Segue或更改了Segue標識符,我想要進行測試。如何測試在故事板中附加的segue

從用戶角度來看,用戶在表格視圖的單元格上點擊,然後應該執行該segue。

從測試的角度來看,我可以調整prepare(for:sender:)方法來驗證執行segue,但我不知道如何以編程方式觸發「tap」。

我試過tableView.selectRow(at:animated:scrollPosition),cell.setSelected(_:animated:)而那些都沒有工作。

  1. 如何以編程方式觸發通過InterfaceBuilder添加的segue?
  2. 或者還有其他方法來測試這個segue綁定嗎?

更新進一步澄清

我知道如何編程引發賽格瑞 - 因此這不是什麼被要求在這裏。

segue觸發工作由storyboard在場景後面完成,生產代碼中沒有segue觸發代碼(只有覆蓋prepare(for:sender:))。該應用按預期工作。這裏的問題是我需要一個測試來保證這種幕後觸發始終存在,也就是說,如果有一天我喝醉了,並且錯誤地編輯了故事板以將原始的賽格連接到某個無關緊要的地方,那麼將會有一個測試去紅色和踢我的屁股。

+0

'performSegue'將編程執行SEGUE – user1046037

+0

是的,但我想考的是「細胞上的水龍頭會觸發賽格「,而不是」當賽格觸發時會發生什麼「 –

+2

用戶界面測試 - https://developer.apple。com/library/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/09-ui_testing.html – user1046037

回答

-1

只需使用本功能:
[self performSegueWithIdentifier:@"YOURIDENTIFIER" sender:self]; 它可以幫助你測試你SEGUE。

+0

正如我在問題''我想要一個測試,如果我刪除界面生成器中的segue或將更改segue identifier',我沒有測試segue行爲,但是存在segue綁定 –

+0

這是正確的方法,如果沒有指定標識符的segue,則此方法拋出異常處理。 – user1046037

+0

如果有一個具有正確標識符的segue,但它連接到一些不相關的UI元素會怎麼樣?這個函數調用不會失敗 –

0

你可以試着這樣做:

1-你應該創建一個賽格瑞功能:

func handleTap(gesture: UITapGestureRecognizer) { 
    performSegueWithIdentifier("yourSegue", sender: self) 
} 

2 - 添加手勢給您的:

let tap = UITapGestureRecognizer(target: self, action:#selector(handleTap(_:))) 
yourcell.addGestureRecognizer(tap) 
+0

我明白你的意思,但它是某種無關緊要的答案。現在,這個觸發事件由故事板處理(控制單擊單元格到目標視圖控制器),並按預期工作。我不需要添加任何生產代碼來觸發這個segue。我在這裏問的是如何測試它,即當故事板被意外錯誤編輯,並且控制點擊的東西被刪除時,我想要一個測試將在那裏以捕捉這種錯誤編輯。 –

0

我能測試一個連接到視圖控制器而不是表格視圖單元的連線。

在應用程序中,我單擊細胞時執行segue。這大致相當於如果將segue連接到表視圖單元格時所得到的結果。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "showNextView", sender: nil) 
} 

這使得原因請看如下測試:

func testSegue() { 

    let appDelegate = UIApplication.shared.delegate as! AppDelegate 

    // create the view controller that has the segue to be tested 
    let viewController = appDelegate.window?.rootViewController?.storyboard?.instantiateViewController(withIdentifier: "TableViewController") as! TableViewController 

    // assuming the view controller does a Show segue, put it in a navigation controller 
    let navigationController = UINavigationController(rootViewController: viewController) 

    // this is needed or test fails! 
    navigationController.view.layoutIfNeeded() 

    // replace the root view controller with the navigation controller 
    appDelegate.window!.rootViewController = navigationController 

    // finally, select the row! this fires the segue 
    viewController.tableView(viewController.tableView, didSelectRowAt: IndexPath(row: 0, section: 0)) 

    // assert something about the result of the segue 
    XCTAssertTrue(navigationController.visibleViewController is SeguedViewController) 
}