2017-03-29 31 views
0

我想認爲我理解繼承的想法,但顯然我不這樣做,因爲如果XCTest在其類中提供了安裝方法,我爲什麼會在XCTestCase中有一個設置方法而感到困惑? XCTestCase是XCTest的子類,但在閱讀Apple文檔之後,它們在兩者之間沒有任何區別。爲什麼XCTestCase會覆蓋XCTest的設置方法?

import XCTest 
@testable import FirstDemo 

class FirstDemoTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 
     // Put setup code here. This method is called before the invocation of each test method in the class. 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func testExample() { 
     // This is an example of a functional test case. 
     // Use XCTAssert and related functions to verify your tests produce the correct results. 
    } 

    func testPerformanceExample() { 
     // This is an example of a performance test case. 
     self.measure { 
      // Put the code you want to measure the time of here. 
     } 
    } 

} 
+0

哪種設置方法你在說什麼?從'XCTest'繼承的那個你在你的代碼片段中重寫或從'XCTestCase'繼承的類方法? – dan

+0

@dan我在我的代碼段 –

+0

@dan中重寫了一個,當我看着Apple的引用時,他們(XCTest和XCTestCase)都有這些方法,但它們看起來很相似,或者至少我不能看到Apple的實現 –

回答

3

XCTest是一個基類,具有空的setUp()tearDown()方法。

XCTestCase繼承自XCTest,所以它繼承了那些相同的方法。它沒有自己的實現。無論如何,它們只是無所作爲的方法。它們只是被定義爲我們可以覆蓋它們。這是Template Method design pattern的一個示例。

爲什麼要在XCTest中定義這些方法,或者有XCTest呢?測試運行者可以使用來自XCTest的任何子類,並且對XCTestCase一無所知。這可能使我們能夠定義除XCTestCase子類之外的定義測試套件的新方法,同時仍然與XCTest框架集成。

更多關於xUnit架構,見JUnit: A Cook's Tour

2

您可以重寫子類中的某個方法,以向超類所具有的功能添加更多功能。

您可以完全覆蓋超類的實現,也可以在覆蓋方法中調用super.setUp()以在覆蓋中添加的任何內容之前執行超類的實現。

在測試中,XCTestCase子類通常會覆蓋setUp()以爲該類添加常用設置操作,而超類的實現將爲整個套件執行常用設置操作。例如,一個XCTestCase子類將有一個啓動應用程序的setUp()方法,並且該類的子類將有一個調用其超類設置的setUp()方法,然後初始化該類中的待測區域。在單元測試中,這可能意味着要創建一個對象,或者在UI測試中,這可能意味着導航到應用程序中的特定頁面。

如果您希望在測試的設置階段發生某些事情,您需要重寫XCTestCase的setUp(),因爲默認情況下它具有空實現。

是XCTest具有已定義的setUp()方法的原因(儘管它什麼都不做)是使上XCTest其他方法來調用setUp(),例如,invokeTest()上XCTestCase呼籲setUp()。這使得框架的用戶可以通過覆蓋不需要任何測試調用邏輯的方法來指定在每次測試開始時要執行的動作,而不必使用其中的其他邏輯覆蓋方法,而我們不會在重寫該方法時必然知道並且可能無法正確執行或完全執行。這個模型使setUp()成爲一個安全的地方,您可以完全按照自己的選擇執行代碼,而無需擔心是否破壞了整個測試框架。

相關問題