Как я могу проверить приватную или fileprivate функцию в проекте - PullRequest
0 голосов
/ 26 апреля 2018

Я хочу написать некоторый код модульного тестирования для класса менеджера, функция, для которой я бы написал, использует несколько небольших функций private. Я буду много готовиться, если буду тестировать функцию public, поэтому я хочу протестировать эти private функции. Но в тестовой цели я не могу напрямую вызвать приватную функцию.

Итак, я хочу спросить, есть ли способ проверить их, не меняя их с private на internal или public?

Ответы [ 4 ]

0 голосов
/ 26 апреля 2018

Я думаю, вы ищете @testable импорт. Из документации Apple:

Когда вы добавляете атрибут @testable в оператор импорта для модуль скомпилирован с включенным тестированием, вы активируете расширенный доступ для этого модуля в этой области. Классы и ученики помечены как внутренний или публичный ведут себя так, как будто они были помечены как открытые Другие лица помечены как внутренние акты, как если бы они были объявлены публичными.

0 голосов
/ 26 апреля 2018

Итак, я хочу спросить, есть ли способ проверить их, не меняя их с частного на internal или public?

Добавить внутреннюю функцию, которая не выполняет ничего, кроме вызова закрытой функции. Вероятно, лучше сделать это в расширении:

class Foo
{
    fileprivate func myPrivateFunction(p: Int) { ... }
}

extension Foo 
{
    internal func testMyPrivateFunction(p: Int) 
    {
        myPrivateFunc(p: p)
    }
}

Вероятно, вы можете найти способ использования условной компиляции, чтобы опустить расширение для сборок релиза, например,

#if DEBUG
extension Foo 
{
    internal func testMyPrivateFunction(p: Int) 
    {
        myPrivateFunc(p: p)
    }
}
#endif

Не проверял условную вещь, чтобы увидеть, работает ли она, она заимствована отсюда https://ericasadun.com/2018/04/18/forcing-compiler-errors-in-swift/

0 голосов
/ 26 апреля 2018

Интерфейсы - это решение.

Это решение немного сложнее, чем другие, но может помочь вам для разных целей, например, для отсоединения модулей в вашем приложении.

Допустим, у вас есть класс Foo, который имеет объект типа Bar, и вам нужно вызвать doStuff().

Создать Протокол для Bar. Таким образом, Foo отделен от Bar и становится полностью тестируемым, не раскрывая его содержимое Foo. Примерно так:

protocol BarProtocol {
   func doStuff()
}

class Bar:BarProtocol {
   func doStuff() {
      print("Hello world")
   }
}

class Foo {
   var bar:BarProtocol

   init() {
      self.bar = Bar()
      self.bar.doStuff()
   }
}
0 голосов
/ 26 апреля 2018

К сожалению, нет. В Swift нет тега «VisibleForTesting», как в Java.

Однако вы можете определить протокол, который затем реализует ваш класс менеджера, включая только те методы, которые вы хотите протестировать.

Например, если у вашего менеджера есть функция createViewModel, которая вызывает несколько приватных методов, проверяющих, что созданная viewModel совпадает с тем, что мы ожидаем, мы неявно протестировали работу приватных методов. Вы можете настроить своего менеджера с различными начальными условиями для тестирования всех разновидностей и граничных случаев

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...