2017-07-28 116 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))