2017-08-31 49 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

不。这是错误的,因为单元测试应尽可能独立。如果与服务器的连接不起作用,则测试将失败。 –

相关问题