2015-12-04 24 views
4

我們正在使用Swift 2.x(最新版本)並希望BDD(單元測試)我們的代碼。另外,我們也使用RxSwift。我們的重寫方法不會在我們的自定義測試存根中被調用。我們的代碼:如何替代測試的清單Observation <T>?

protocol SomethingDeliverable { 
    func fetchSomething(somethingId: String, associatedList: String) -> Observable<String> 
} 

extension SomethingDeliverable { 
    func fetchSomething(somethingId: String, associatedList: String) -> Observable<String> { 
     return create { observer in 
      return NopDisposable.instance 
     } 
    } 
} 

爲了測試的緣故,我們有這樣的測試代碼:

private class StubSomethingApi: SomethingDeliverable { 

    var responseClosure: ((AnyObserver<String>) -> Void)? 

    func fetchSomething(somethingId: String, associatedList: String) -> Observable<String> { 
     return create { observer in 
      if let responseClosure = self.responseClosure { 
       responseClosure(observer) 
      } 
      return NopDisposable.instance 
     } 
    } 
} 

而不是fetchSomething返回可觀察< 字符串>,我們想返回可觀察< 牛逼>和StubSomethingAPI會成功覆蓋它以進行測試。 我們該怎麼做?

+1

它看起來像Swift中的一個bug,我在一週前遇到過同樣的問題。這裏是我的代碼來演示一個錯誤http://swiftstub.com/399644727/ –

+0

在探索解決方案的時候,我遇到了沒有編譯的PAT(帶相關類型的協議) - Alexis Gallagher的這個演講 - 帶有關聯的協議類型 - 幫助我理解爲什麼:https://youtu.be/XWoNjiSPqI8 – finneycanhelp

+0

相關:https://lists.swift.org/pipermail/swift-evolution/2015-December/000037.html – finneycanhelp

回答

0

這是你在找什麼?

protocol SomethingDeliverable { 
    associatedtype Element 

    func fetchSomething(somethingId: String, associatedList: String) -> Observable<Element> 
} 

extension SomethingDeliverable { 
    func fetchSomething(somethingId: String, associatedList: String) -> Observable<Element> { 
     return create { observer in 
      return NopDisposable.instance 
     } 
    } 
} 

private class StubSomethingApi<T>: SomethingDeliverable { 

    typealias Element = T 

    var responseClosure: ((AnyObserver<T>) -> Void)? 

    func fetchSomething(somethingId: String, associatedList: String) -> Observable<T> { 
     return create { observer in 
      if let responseClosure = self.responseClosure { 
       responseClosure(observer) 
      } 
      return NopDisposable.instance 
     } 
    } 
}