如何使用Swift和CocoaPods在iOS上对TwilioChatClient进行单元测试

问题描述:

由于Twilio Programmable Chat SDK非常复杂,我有时会遇到在应用程序中难以复制的场景,所以我决定做一些单元测试。 问题是,我无法初始化TwilioChatClient。你有什么想法我做错了吗?如何使用Swift和CocoaPods在iOS上对TwilioChatClient进行单元测试

的Xcode调试控制台

Test Case '-[ONNTests.ONNTests testTwoClientCreation]' started. 
    0x7000065c6000 | 12/18/13:26:18.979 | FATAL | Chat-iOS | Error instantiating client framework path. 
    0x7000065c6000 | 12/18/13:26:18.980 | DEBUG | Chat-iOS | releasing chat client instance: <TwilioChatClient: 0x7fcf01552c20> 

Podfile

target 'MyTests' do 
    pod 'TwilioChatClient', '~> 2.1.0' 
end 

代码

import XCTest 
import TwilioChatClient 

class MyTests: XCTestCase { 
    var client1: TwilioChatClient? 

    let e1 = XCTestExpectation(description: "Download Twilio token 1") 
    let e2 = XCTestExpectation(description: "Create client 1 successfully") 

    func testTwilioClientCreation() { 
     TwilioChatClient.setLogLevel(.debug) 

     getToken { [unowned self] token in 
      self.e1.fulfill() 
      TwilioChatClient.chatClient(withToken: token, properties: nil, delegate: self) { [unowned self] (result, client) in 
       if result.isSuccessful() { 
        self.client1 = client 
        self.e11.fulfill() 
       } 
      } 
     } 

     wait(for: [e1, e2], timeout: 20.0) 
    } 

    func getToken(completion: @escaping (_ token: String) -> Void) { 
     // ... 
    } 
} 
+0

Twilio开发人员在这里传播。我对iOS的测试并不知情,但我已经在内部询问是否有其他人可以提供帮助。您是否在此测试中从外部服务中检索令牌?一般来说,这对我来说似乎很脆弱。另外,在一个测试中实例化一个完整的'TwilioChatClient'也将建立与Twilio服务的各种连接。你可以看看嘲讽Twilio服务本身吗? – philnash

+0

嗨@philnash感谢您的回复。检索令牌对我来说工作得很好。这似乎与项目设置,路径或类似的东西有些复杂。我知道在测试中模拟这样的服务是一个好主意和常见方法,但我不想测试我的应用程序,但是Twilio本身。我已经在iOS的Programmable Chat SDK中发现了3个错误(它们已经在GitHub问题上或在您的支持服务单上),所以我只是想要一个能够轻松测试/复制一些复杂场景的环境(创建频道,邀请,接受,离开,删除等)。 –

+0

然后我不禁害怕,我对iOS的测试不够了解。感谢您帮助测试SDK,我希望您发现的错误能够迅速为您解决。 – philnash

它看起来像Twilio ChatClient可以通过被测目标引入,而不是直接进入测试。这可能会导致我们查找框架中包含的资源的问题,这是您看到的消息。

要解决此问题,请确保TwilioChatClient框架直接声明为一个依赖于你的测试目标,例如:

target 'TestingSample' do 
    pod 'TwilioChatClient', '~> 2.1.0' 

    target 'TestingSampleTests' do 

    end 
end 

另外请注意,它是关机,当你用做客户端重要它可以在您的测试方法结束时或者在共享拆除方法中使用。

wait(for: [e1, e2], timeout: 20.0) 

self.client1?.shutdown() 
self.client1 = nil 

一个工作示例项目可以找到here

我们将在未来的版本中使这一过程更加流畅,请让我们知道如果上述问题解决了您所看到的单元测试问题,或者我们可以进一步提供帮助。