Какой лучший способ обмануть объекты в быстрой версии XCTest? Является ли это просто определением классов внутри функций с требуемой функциональностью? Или существуют лучшие варианты?
Каков лучший способ издеваться над объектами в XCTest?
Ответ 1
Вы можете выполнять протокол mocks и класс mocks с MockFive. Он регистрирует методы, вызываемые и переданные аргументы, и позволяет вам останавливать методы во время выполнения, поэтому вы можете просто написать один макет и настроить его на основе каждого теста. Я написал статью о том, как ее использовать здесь.
Ответ 2
Я рекомендую использовать Cuckoo, который похож на Mockito.
Примеры классов:
class ExampleObject {
var number: Int = 0
func evaluate(number: Int) -> Bool {
return self.number == number
}
}
class ExampleChecker {
func check(object: ExampleObject) -> Bool {
return object.evaluate(5)
}
}
Пример теста:
@testable import App
import Cuckoo
import XCTest
class ExampleCheckerTests: XCTestCase {
func testCheck() {
// 1. Arrange
let object = MockExampleObject().spy(on: ExampleObject())
stub(object) { object in
when(object.evaluate(any())).thenDoNothing()
}
let checker = ExampleChecker()
// 2. Action
checker.check(object)
// 3. Assert
_ = verify(object).number.get
verify(object).evaluate(any())
verifyNoMoreInteractions(object)
}
}
Ответ 3
Если вы не против и у вас есть время, напишите их сами.
В противном случае, есть некоторые фреймворки, которые помогут с макетами:
- SwiftyMocky - хороший синтаксис, поддерживает обобщенные формы, очень гибкий, кажется стабильным, но макетирование основано только на определениях протокола
- Cuckoo - работает с насмешливыми классами, но пропускает некоторые важные вещи, такие как обобщенные или переменные экземпляра. Есть много открытых вопросов тоже.
- OCMock, если вы в порядке с использованием objc
Если вы правильно настроили свои слои, я рекомендую использовать SwiftyMocky
Я также должен упомянуть, чтобы быть одним из авторов этого, так что я буду рад услышать некоторые отзывы :)