Как программно отредактировать настройки доступности iPhone во время модульного тестирования?

#ios #swift #unit-testing

#iOS #swift #модульное тестирование

Вопрос:

Мое приложение поддерживает динамические шрифты. Когда пользователь изменяет размер шрифта в настройках ( Settings > General > Accessibility > Larger Text ) и возвращается к приложению, тогда каждая метка должна быть обновлена.

Это реализовано путем переопределения функции UILabel

 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    guard previousTraitCollection?.preferredContentSizeCategory != traitCollection.preferredContentSizeCategory else { return }

    let metrics: UIFontMetrics = UIFontMetrics(
        forTextStyle: UIFont.TextStyle.body
    )
    font = metrics.scaledFont(for: font)
}
  

Теперь мне нужно проверить, правильно ли другие представления реагируют на динамический характер метки.

В частности, я хотел бы провести следующий модульный тест:

  1. Создать представление с меткой
  2. Получить размер представления
  3. Измените системный шрифт на более крупный
  4. Получить размер представления
  5. Сравните, изменились ли размеры
 func testDynamicFont() {

    let v: MyView = MyView()
    let oldSize: CGSize = v.intrinsicContentSize
    ??? What to do here? ???
    let newSize: CGSize = v.intrinsicContentSize
    XCTAssertNotEqual(
        oldSize, 
        newSize, 
        "Size of view should adjust to new environment"
    )
}
  

Комментарии:

1. Решает ли приведенный ниже ответ вашу проблему?

2. Да, это так. Спасибо 🙂

Ответ №1:

Вы можете увеличить размер системного шрифта, используя приведенный ниже код.

     let settings = XCUIApplication(bundleIdentifier: "com.apple.Preferences")
    settings.launch()
    settings.tables.staticTexts["General"].tap()
    settings.tables.staticTexts["Accessibility"].tap()
    settings.tables.staticTexts["Larger Text"].tap()
    settings.sliders.element.adjust(toNormalizedSliderPosition: 0.7) // Increase as you need
  

Чтобы вернуться к своему собственному приложению,

 let yourapp = XCUIApplication(bundleIdentifier: "com.xxx.yourappbundleid")
yourapp.activate()
  

Протестировано на iPhone (реальном устройстве), iOS 12.1.4