XCTest: как мы можем внедрить класс во время выполнения

#swift #dependency-injection #xcode-ui-testing

#swift #внедрение зависимости #xcode-ui-testing

Вопрос:

По очевидным причинам я не хочу загрязнять свой производственный код тестовым кодом. Я пытаюсь использовать платформу тестирования пользовательского интерфейса XCode. Во время выполнения я хочу заменить один из классов другим, который существует только в моей цели тестирования.

Есть идеи, как я могу этого добиться?

Комментарии:

1. Взгляните на SBTUITestTunnel , это может пригодиться.

2. Согласно их документации, SBTUITestTunnel должен содержать компоненты, «один из которых должен быть создан в приложении, а другой — в тестовом коде». Мне бы очень хотелось избежать использования какого-либо кода, связанного с тестированием, в рабочей среде.

Ответ №1:

Вам нужно то, что называется тестовым макетом.

Вы создаете макет класса в своем тестовом файле, который расширяет класс, который вы хотите создать.

 class MockHttp extends HttpService {
  var getWasCalledCount = 0

  override func get(request: URLRequest) { 
   getWasCalledCount = getWasCalledCount   1
  }
}
  

Затем в вашем тесте вы изменяете исходное свойство класса с помощью mock (мне нравится изменять его в методе setUp)

 override func setUp() {
  var mockHttp = MockHttp()
  classIWantToInjectWithMock = ClassIWantToInjectWithMock(http: mockHttp)
}
  

Я надеюсь, что это поможет! Хорошего дня!