У меня есть такой сценарий:
class X {
init(y: ProtocolA)
func foo(){
if(y.isSomething()){
methodA()
} else {
methodB()
}
}
func methodA(){
// any
}
func methodB(){
// any
}
}
class Y : ProtocolA {
func isSomething(): Bool { return true OR false }
}
я хочу проверить класс X ,
Я буду издеваться ProtocolA для возврата в isSomething () метод true или false в двух разных тестах, чтобы узнать, methodA или methodB был вызван.
Какая лучшая стратегия для решения этой проблемы?
пс: с мокито, с помощью шпиона с проверить это очень легко, но с помощью Swift это очень больно
редактирование:
хорошо, я делаю это:
сначала части:
class X { init(y: Y) }
protocol Y { func isSomething() -> Bool }
Теперь структура для тестирования: макет и шпионский объект
typealias VerifyMethodAssert = (count: Int, parameters: [Any]?, returnn: Any?)
Настраиваемый макет для зависимости
class YMock : Y {
init(configure: Bool)
func isSomething{ return configure }
}
Шпион для конкретного класса
class XSpy : X {
private let y: Y
var verify: [String: VerifyMethodAssert] = [
"methodA()": (count: 0, parameters: nil, returnn: nil)
"methodB()": (count: 0, parameters: nil, returnn: nil)
]
var nothing: [String: Bool] = [
"methodA()": false
"methodB()": false
]
init(y: Y, verify: [String: VerifyMethodAssert]?, nothing: [String: Bool]?)
func methodA(){
verify["\(#function)"] = (count: verify["\(#function)"]!.count + 1, parameters: nil,
returnn: nothing["\(#function)"]! ? nil : super.methodA())
}
func methodB(doNothing: Bool = false){
verify["\(#function)"] = (count: verify["\(#function)"]!.count + 1, parameters: nil,
returnn: nothing["\(#function)"]! ? nil : super.methodB())
}
}
и тест:
class XTest : QuickSpec {
override func spec(){
describe("a position view model"){
it("test 1"){
let y = Y(configure: true)
let x = XSpy(y: y)
x.foo()
expect(1).to(x.verify["methodA()"].count)
expect(0).to(x.verify["methodB()"].count)
}
it("test 2"){
let y = Y(configure: true)
let x = XSpy(y: y)
x.foo()
expect(0).to(x.verify["methodA()"].count)
expect(1).to(x.verify["methodB()"].count)
}
}
}
}