Swift单元测试mock类静态方法

Art*_*rti 10 macos unit-testing ios swift

我在课堂上有一个静态方法

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

class B {
    func getTitle() -> String {
        // some functionality here
    }
}
Run Code Online (Sandbox Code Playgroud)

在我想要测试的类方法中,我使用它:

func someBoolFunc() -> Bool {
    var b = A.myStaticMethod()
    if (b.getTitle() = “hello”) {
         return true
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

如何为此编写模拟类...我尝试过:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

在测试中,我想使用类似的东西:

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

但当然只是在理论上:(

Dan*_*uke 13

也许这样?

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))
Run Code Online (Sandbox Code Playgroud)