2017-07-28 186 views
2

我在課堂斯威夫特單元測試模擬類的靜態方法

class A { 
    static func myStaticMethod() -> B { 
     return B() 
    } 
} 

class B { 
    func getTitle() -> String { 
     // some functionality here 
    } 
} 

一個靜態方法在我的類的方法,我想測試我使用它像:

func someBoolFunc() -> Bool { 
    var b = A.myStaticMethod() 
    if (b.getTitle() = 「hello」) { 
     return true 
    } 
    return false 
} 

如何編寫模擬類這個......我想:

class MockA: A { 
    var myTitle:String 
    // this seems incorrect, because i didn't override static function 
    func myStaticMethod() -> MockB { 
     var b = MockB() 
     b.title = myTitle 
     return b 
    } 
} 

class MockB: B { 
    var myTitle:String  

    func getTitle() -> String { 

     return myTitle 
    } 
} 

而且在測試中,我想用這樣的:

func testExample() { 
    A = MockA 
    MockA.title = "My title" 
    // And now this func should use my MockA instead of A 
    someBoolFunc() 
} 

但當然這只是在理論上:(

回答

3

也許這種方式?

protocol AProto { 
    static func myStaticMethod() -> BProto 
} 

class A: AProto { 
    static func myStaticMethod() -> BProto { 
    return B() 
    } 
} 

class MockA: AProto { 
    static func myStaticMethod() -> BProto { 
    return MockB() 
    } 
} 

protocol BProto { 
    func getTitle() -> String 
} 

class B: BProto { 
    func getTitle() -> String { 
    return "hello" 
    } 
} 

class MockB: BProto { 
    func getTitle() -> String { 
    return "bye bye" 
    } 
} 

func someBoolFunc(_ aProto: AProto.Type = A.self) -> Bool { 
    var b = aProto.myStaticMethod() 
    if (b.getTitle() == "hello") { 
    return true 
    } 
    return false 
} 

print(someBoolFunc()) 
print(someBoolFunc(MockA.self))