无法在 Swift 中从 XCTest 打开 NSStream

Posted

技术标签:

【中文标题】无法在 Swift 中从 XCTest 打开 NSStream【英文标题】:Can't open NSStream from XCTest in Swift 【发布时间】:2014-08-20 05:35:10 【问题描述】:

我正在尝试编写一个测试套接字连接的 XCTest。这是我的连接代码大致如下所示:

public class MyConnection: NSObject, NSStreamDelegate 
  private let queue = NSOperationQueue()
  private var inputStream: NSInputStream!
  private var outputStream: NSOutputStream!

  public func connect() 
    println("Attempting to connect")
    queue.addOperationWithBlock() 
      var readStream: Unmanaged<CFReadStream>?
      var writeStream: Unmanaged<CFWriteStream>?
      CFStreamCreatePairWithSocketToHost(nil,
                                         "[my ip address]",
                                         8333,
                                         &readStream,
                                         &writeStream);
      if readStream == nil || writeStream == nil 
        println("Connection failed")
        return
      
      self.inputStream = readStream!.takeUnretainedValue()
      self.outputStream = writeStream!.takeUnretainedValue()
      self.inputStream.delegate = self
      self.outputStream.delegate = self
      self.inputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode:NSDefaultRunLoopMode)
      self.outputStream.scheduleInRunLoop(NSRunLoop.currentRunLoop(), forMode:NSDefaultRunLoopMode)
      self.inputStream.open()
      self.outputStream.open()
    
  

  // MARK: - NSStreamDelegate

  public func stream(stream: NSStream!, handleEvent event: NSStreamEvent) 
    println("THIS NEVER GETS CALLED!")
    // Notifies delegate that connection opened.
  

我写的 XCTestCase 基本上只是调用 connect() 方法,并等待连接成功后调用委托方法。但是,从不调用委托方法。我是否需要为此做一些特别的事情才能在我的测试中发挥作用?

【问题讨论】:

【参考方案1】:

这在我的单元测试中失败的事实是一个红鲱鱼。由于 NSOperationQueue 的工作方式,此代码不起作用。队列动态创建和销毁线程。所以我在运行循环中为一个生命周期很短的线程安排了我的流。因此,我的回调从未被调用,因为运行循环被破坏了。

正确的解决方案是直接创建一个 NSThread 并使用该线程的运行循环,而不是尝试使用队列。

【讨论】:

请问如何解决这个问题,你能做一个示例代码吗?

以上是关于无法在 Swift 中从 XCTest 打开 NSStream的主要内容,如果未能解决你的问题,请参考以下文章

在 XCTest 的 UI 测试中从 TextView 获取文本

在 swift 4.0 中从 firebase 快照字典中获取值时打开一个可选的 nil

如何在 xctest 中使用 swift 点击地图注释时访问标注视图

在 XCTest 测试中从情节提要加载的视图控制器中清空 UIView 快照(间歇性)

使用 Realm 进行 Swift XCTest UI 测试

Swift 3 - 在 Safari 中从 JSON 打开 URL