Каков лучший способ издеваться над объектами в 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

Я также должен упомянуть, чтобы быть одним из авторов этого, так что я буду рад услышать некоторые отзывы :)