Ответ 1
Вы значительно улучшите тестируемость, не используя методы класса здесь. Создайте протокол TwitterConnection
. Создайте SystemTwitterConnection
, который соответствует ему и управляет вещами через ACAccountStore
. Создайте TestTwitterConnection
, который возвращает заданные ответы, которые вы можете настроить для тестирования. Вы даже можете создать KeychainTwitterConnection
для управления входами в Twitter с помощью ACAccountStore
или другой реализации, если Apple выпустит еще один способ хранения этих учетных записей.
Передайте соответствующее соединение Welcome
при его создании.
Если протокол TwitterConnection
становится большим, вам следует рассмотреть возможность его разделения на более мелкие протоколы, такие как TwitterAuthenticator
и TweetFetcher
, которые обрабатывают меньшее количество вещей (даже если один тип фактически реализует все эти протоколы). Это может значительно облегчить тестирование, позволяя вашим тестовым типам реализовать всего несколько функций, а не десятки.
Использование закрытий, вероятно, прекрасное, но вы должны более внимательно относиться к соглашениям об именах Cocoa. То, что вы называете callback
, традиционно называется completion
. Я также следовал примеру Cocoa о том, как назвать методы. Вместо getPermission()
это будет requestAccessWithCompletionHandler()
. Это поможет вызывающему абоненту понять, что он имеет очень похожее поведение с requestAccessToAccountsWithType(options:completion:)
. Не создавайте новый словарь для вызывающего.