Как мне создать метод 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
  }
}
Другие вопросы по тегам