Сочетание тестируемого кода с отправкой статического метода в swift - PullRequest
0 голосов
/ 07 ноября 2018

В последнее время я много читал о среде выполнения Swift и все больше и больше интересовался оптимизацией моего кода с использованием статической диспетчеризации методов. Это происходит с помощью следующих методов:

  • методы struct
  • методы финального класса, то есть объявленные с ключевым словом final, как закрытые или в финальном классе
  • методы протокола, которые определены в расширении протокола, без объявления в самом протоколе.

Проблема в том, что ни одна из этих ситуаций не позволяет мне писать тестируемый код, по крайней мере, не так, как я это делаю сейчас: вводить объекты протокола, которые заменяются на mocks в модульном тестировании.

Итак, возможно ли написать тестируемый код, не отказываясь от отправки статического метода, и если да, то как это сделать?

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

Дженерики - это то, что вы ищете. Вы можете абстрагироваться по протоколу, но компилятор все еще знает, какой именно тип вы используете, поэтому нет необходимости в динамической диспетчеризации.

protocol Dependency {
  func doSomething()
}

struct RealDependency: Dependency {
  func doSomething() {
    print("I'm doing real work")
  }
}

struct MockDependency: Dependency {
  func doSomething() {
    print("I'm the mock, so I do nothing")
  }
}

struct MyApp<D: Dependency> {
  let dependency: D

  func doSomething() {
    dependency.doSomething()
  }
}

let myAppReal = MyApp(dependency: RealDependency())
let myAppMock = MyApp(dependency: MockDependency())

myAppReal.doSomething() // Prints "I'm doing real work"
myAppMock.doSomething() // Prints "I'm the mock, so I do nothing"

Однако обратите внимание, что в Swift универсальная мономорфизация не гарантируется. Таким образом, вы могли бы закончить с какой-либо формой динамической отправки в любом случае. Смотрите эту ссылку

...