2016-10-24 8 views
2

Я использую Fastlane'ssnapshot для создания скриншотов для приложения, которое я собираюсь отправить в App Store.Сложность чтения UserDefaults с моментальным снимком Fastlane

Он работает «как рекламируемый» по большей части, но мне не кажется, что я получаю доступ к UserDefaults в своем приложении. В одном тесте он генерирует Статус выхода: 65 Ошибка.

UI Testing Failure - com.me.MyApp crashed in (extension in MyApp):__ObjC.NSObject.defaultTime() -> Swift.Float

Я нахожу UserDefaults.standard.value(forKey: "defaultTime") на приглашение для синтаксической ошибки, поэтому я создал расширение для доступа UserDefaults. Вот что расширение выглядит следующим образом:

class CustomExtensions: NSObject { 
    /* 
    This is blank. Nothing else in here. No really...nothing else 
    */ 
} 

extension NSObject { 
    // User Defaults  
    func defaultTime() -> Float { 
     return UserDefaults.standard.value(forKey: "defaultTime") as! Float 
    } 

    // a bunch of other UserDefaults  
} 

Wihin приложения, когда мне нужно defaultTime, я просто введите defaultTime(). Использование этого метода для доступа к значениям UserDefaults отлично работает в Simulator и на тестируемых устройствах. Я столкнулся только с проблемой snapshot.

Я попытался добавить в sleep(1) внутри теста, но это ничего не делает. Я приветствую предложения re: альтернативные способы доступа к UserDefaults, которые позволяют мне легко обращаться к ним во всем MyApp.

ответ

3

Возможно, что на вашем тренажере и на устройстве вы записываете значение по умолчанию для ключа defaultTime перед его чтением. value(forKey: возвращает необязательный параметр, и если вы принудительно развернете его (или принудительно сбрасываете вниз, как вы это делаете здесь), вы сработаете, если значение будет равно нулю. Попробуйте либо возвращение опциональный:

func defaultTime() -> Float? { 
    return UserDefaults.standard.value(forKey: "defaultTime") as? Float 
} 

или использовать значение по умолчанию:

func defaultTime() -> Float { 
    return UserDefaults.standard.value(forKey: "defaultTime") as? Float ?? 0.0 
} 
+0

Awesome! Я просто читал о 'nil coalescing operator 'здесь https://www.hackingwithswift.com/read/12/2/reading-and-writing-basics-userdefaults. Это разрешило эту проблему, теперь я должен настроить мой тест, чтобы щелкнуть правую ячейку ... это должно быть немного проще :) Спасибо! – Adrian

+1

Как в стороне, мои первоначальные значения по умолчанию заданы в 'AppDelegate.swift'. Чтобы ваше решение разрешило мою проблему, мне говорят, что тесты пользовательского интерфейса пропускают приложение AppDelegate. Я никогда бы этого не догадался. Надеюсь, этот комментарий кто-то еще идет по линии. – Adrian