Ответ 1
Это исправлено в Swift 2.0 с атрибутом @testable
.
Если вы импортируете свой модуль в тесты с помощью @testable
, синтезированные инициализаторы станут видимыми для ваших тестов.
Вы можете найти краткое введение в @testable
здесь.
Я пытаюсь использовать публичную структуру
public struct Person {
public let name: String
}
в unit test (XCTest):
let person = Person(name: "Paul")
Сбой теста с ошибкой:
"Person" не может быть сконструирован, поскольку он не имеет доступных инициализаторов.
Чтобы построить тест, мне нужно написать инициализатор для структуры. Не кажется правильным, потому что у структур уже есть инициализаторы. У кого-нибудь есть лучшее решение?
Версия Xcode 6.1.1 (6A2008a)
Это исправлено в Swift 2.0 с атрибутом @testable
.
Если вы импортируете свой модуль в тесты с помощью @testable
, синтезированные инициализаторы станут видимыми для ваших тестов.
Вы можете найти краткое введение в @testable
здесь.
Проблема заключается в том, что автоматически синтезированный инициализатор, который вы получаете со структурой, синтезируется как internal
, что означает, что к нему нельзя получить доступ из другого модуля.
В настоящее время тесты вашего устройства выполняются в другом модуле, поэтому они не могут видеть инициализатор. Как отмечает Бен-Г в своем ответе, это рассматривается как Swift 2.0 с атрибутом @testable
.
Это часть общей разбитости модульного тестирования в проектах Swift. Модуль модульного тестирования должен иметь специальный доступ к модулям приложения, в противном случае вам необходимо добавить грузы для контроля над багажом.
Из documentation:
По умолчанию инициализаторы по умолчанию для типов структуры
По умолчанию инициализатор по умолчанию для типа структуры считается приватным, если какое-либо из хранимых свойств структуры является закрытым. В противном случае инициализатор имеет внутренний уровень доступа.
Как и в случае с инициализатором по умолчанию выше, , если вы хотите, чтобы тип публичной структуры был инициализирован с помощью инициализатора-члена при использовании в другом модуле, вы должны предоставить инициализатор с открытым исходным кодом самостоятельно как часть определения типов.