私は単体テストであるSwiftクラスを持っています。このクラスの主な目的は、HTTP呼び出しを行うことです。私はちょうどMockingjayを使ってすべてのネットワーキング要求を嘲笑し終えましたが、今後のリクエストを模擬することを忘れないようにしたいと思います。私が初期の嘲笑をしている間、私は使用しているベースURLを、動作しないURLに置き換えましたが、私はのためにの場所に保持したいと思います。テスト対象のクラスは次のようになります。テスト用のSwiftクラスプロパティをオーバーライドする方法
public class MyWebServiceWrapper {
...
public class var baseURL: String {
return "https://api.thesite.com"
}
...
}
私はbaseURL
の実装を置き換えるためのObjective-CクラスからOCMockを使用することを試みた、と私は、同様の方法スウィズリングas described on NSHipsterを使用してみました(IクラスをNSObject
から派生させ、上記のプロパティの代わりにbaseURL
をメソッドに置き換えました。特に、クラスがNSObject
のサブクラスである必要はないので、私はむしろうまくいきません。
これは、私が試したスウィズルを実行するために使用したコードです。これは効果がありません。 (スウィフト中)
3210これだった私のスウィズリングの試み:以下の両方試みたソリューションについては、私は(それがどちらのアプローチがスウィフトプロパティまたは純粋スウィフトのクラスでうまく機能するであろうように見えたので)そのようにテスト中の私のクラスを書き直し。ログに基づいて、毎晩else
というステートメントが表示され、何が起こっているか把握するのに役立ちます。
extension MyWebServiceWrapper {
public override class func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
if self !== MyWebServiceWrapper.self {
return
}
dispatch_once(&Static.token) {
NSLog("Replacing MyWebServiceWrapper base URL...")
let originalSelector = #selector(baseURLValue)
let swizzledSelector = #selector(networkFreeBaseURL)
guard let klass = object_getClass(self) else {
return
}
let originalMethod = class_getClassMethod(klass, originalSelector)
let swizzledMethod = class_getClassMethod(klass, swizzledSelector)
let didAddMethod = class_addMethod(klass, originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod))
if didAddMethod {
NSLog("MyWebServiceWrapper method added")
class_replaceMethod(klass, swizzledSelector, method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod))
} else {
method_exchangeImplementations(originalMethod, swizzledMethod)
NSLog("MyWebServiceWrapper implementation replaced")
}
}
}
class func networkFreeBaseURL() -> String {
return "https://tests-shouldnt-hit-the-network.com"
}
}
これは(Objective-Cの)OCMockを使用してメソッドを置き換えようとした方法です。このコードは、単体テストの設定時に呼び出されます。
id wrapperMock = OCMClassMock([MyWebServiceWrapper class]);
OCMStub(ClassMethod([wrapperMock baseURLValue])).andReturn(@"https://tests-shouldnt-hit-the-network.com");
baseURL
から無効な値を返すという目標を達成する正しい方法はありますか?
あなたは、別の方法を見つける必要がある:( あなたがどんな解決策を見つけるか – denis631
denis631 @私はまだです?答えを使用して私は – Dov
悲しい...それはちょうど右のように見えないが、あなたが知っている... GTD:GET THINGS Done :) – denis631