Как мне создать метод init для структуры, которая видна только в тестах?
Я хочу создать метод init для моей структуры с кучей значений по умолчанию для использования в модульных тестах. Я не хочу, чтобы основной модуль мог видеть этот метод init.
Я думал, что могу просто создать расширение моей структуры в файле моего тестового класса, но это не работает:
Foo.swift (в целевом приложении):
public struct Foo {
public let bar: Int
public init(colour: String) {
self.bar = colour == "Green" ? 0 : 1
}
}
FooExtension.swift (в тестовой цели):
extension Foo {
public init(bar: Int = 42) {
self.bar = bar
}
}
Обратите внимание на нестандартный инициализатор в главном файле, поэтому компилятор Swift не создает для меня инициализатор по элементам автоматически. Может быть, это как-то связано с проблемой, а может и нет.
Компилятор Swift жалуется Cannot assign to 'bar' in 'self'
, Но когда я копирую этот метод init в исходное определение моего Foo
структура в моей основной цели, она отлично работает. Я получаю одинаковые результаты со значениями параметров по умолчанию или без них.
Это ошибка компилятора Swift или что-то связанное с определением расширений в одном модуле для структур, определенных в другом? Все отлично работает, когда я пытаюсь повторить это на игровой площадке.
Я использую Swift 1.2 с версией Xcode 6.4 (6E35b)
3 ответа
У меня был ответ на радар, который я подал на это; то, что я прошу, теперь явно запрещено.
Создайте инициализатор (метод init) в структуре, которая будет видна только в тестах, используя атрибут @testable.
например
struct MyStruct {
let property: Int
init(property: Int) {
self.property = property
}
}
@testable import MyModule
class MyStructTests: XCTestCase {
func testInit() {
let myStruct = MyStruct(property: 123)
XCTAssertEqual(myStruct.property, 123)
}
}
Ниже приведен хороший пример для вашего вопроса.
extension Foo {
var text: String
var response: String?
init(text: String) {
self.text = text
}
}