Подтвердить что ты не робот

Зачем мне писать инициализатор для структуры в Swift, чтобы использовать его в модульных тестах?

Я пытаюсь использовать публичную структуру

public struct Person {
  public let name: String
}

в unit test (XCTest):

let person = Person(name: "Paul")

Сбой теста с ошибкой:

"Person" не может быть сконструирован, поскольку он не имеет доступных инициализаторов.

Чтобы построить тест, мне нужно написать инициализатор для структуры. Не кажется правильным, потому что у структур уже есть инициализаторы. У кого-нибудь есть лучшее решение?

Версия Xcode 6.1.1 (6A2008a)

4b9b3361

Ответ 1

Это исправлено в Swift 2.0 с атрибутом @testable.

Если вы импортируете свой модуль в тесты с помощью @testable, синтезированные инициализаторы станут видимыми для ваших тестов.

Вы можете найти краткое введение в @testable здесь.

Ответ 2

Проблема заключается в том, что автоматически синтезированный инициализатор, который вы получаете со структурой, синтезируется как internal, что означает, что к нему нельзя получить доступ из другого модуля.

В настоящее время тесты вашего устройства выполняются в другом модуле, поэтому они не могут видеть инициализатор. Как отмечает Бен-Г в своем ответе, это рассматривается как Swift 2.0 с атрибутом @testable.

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

Из documentation:

По умолчанию инициализаторы по умолчанию для типов структуры

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

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