2017-08-31 41 views
0

我有一個代碼片段,我想單元測試,這個代碼取決於網絡堆棧在接收數據事件時的回調。網絡調用是通過一個庫基本上是亞馬遜iOT庫,因此我不直接與iOS網絡框架交互,但是這個庫。我想單元測試這個代碼,不知道它是否可能如果是的話。如何從服務器接收響應的單元測試代碼

附件中是有問題

static func subscribeForData(completionCallBack:((String,NSDictionary)->())?,errorCallBack:((NSError)->())?) { 
    let iotDataManager = AWSIoTDataManager.default() 
    let defaults = UserDefaults.standard 

    let login = ..... 

    iotDataManager.subscribe(toTopic: "testNode/device/"+login, qoS: .messageDeliveryAttemptedAtLeastOnce, messageCallback: { 
     (payload) ->Void in 
     let stringValue = NSString(data: payload, encoding: String.Encoding.utf8.rawValue)! 
    })  
} 
+0

嘗試使用此LIB嘲笑網絡層:https://github.com/AliSoftware/OHHTTPStubs (你可以添加json文件並將它們作爲特定url調用的網絡響應) –

+0

我的第一個想法是調度信號量,它將等待服務器響應,並且可以發信號燈繼續 – Joshua

+0

@Joshua單元測試應該快。喲應**不**測試真正的網絡電話。 –

回答

1

就可以實現這一目標是通過依賴注入(DI)的最好方法的代碼。

DI可以用作注入真實網絡代碼和「模擬」代碼的手段。

爲了處理DI,你需要修改你的代碼。特別是AWSIoTDataManager的一個實例應該傳遞給subscribeForData方法而不是硬編碼(爲什麼你有一個static方法?)。

爲了解決這個問題,有不同的方法。例如在The complete guide to Network Unit Testing in Swift中描述了一個。我認爲如果你閱讀它,你會獲得一些對這個功能有用的新東西。

你的「嘲笑」類(我把它放在「」,因爲它可以被定義爲存根或間諜)將有相同的API由真正的提供。

正如我前面所說,單元測試應該是快速的,應該是不是取決於數據庫,真正的網絡請求等。

-1

類似的東西(但我與其他成員同意,最好的辦法是用嘲笑):

func testNetSubscription(){ 
    let expect = expectation(description: "testNode/device/"+login) 
    YOURCLASS.subscribeForData(completionCallBack:{(token, dic) in 
      XCTAssert(!token.isEmpty) 
      expect.fulfill()}, errorCallBack:nil) 

    waitForExpectations(timeout: TimeInterval(10)) { (error) in 
     XCTAssertNil(error, "\(String(describing: error))") 
    }} 
+0

您是否打算使用真正的網絡電話? –

+0

如果用戶無法更改庫代碼(讓iotDataManager = AWSIoTDataManager.default()),但庫不穩定,這是方法的工作,但不推薦 –

+0

不。這是錯誤的,因爲單元測試應儘可能獨立。如果與服務器的連接不起作用,則測試將失敗。 –

相關問題