Модульный тест, который утверждает, что текущий поток является основным потоком [iOS] - PullRequest
0 голосов
/ 14 декабря 2018

Вопрос в том, имеет ли смысл написать модульный тест, который утверждает, что текущий поток является основным потоком?Плюсы / минусы?

Недавно я видел модульный тест, который утверждает текущий поток для обратного вызова службы.Я не уверен, что это хорошая идея, я считаю, что это скорее своего рода интеграционный тест.По моему мнению, модульный тест должен утверждать метод изолированно и не должен знать о характере потребителя услуги.

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

ОБНОВЛЕНИЕ:

Внутри службы есть вызов:

DispatchQueue.main.async {
    failure(error)
}

Он запускается во время набора тестов и не проверяется.Таким образом, задержка нарушает правило, согласно которому модульные тесты должны быть быстрыми, а модульные тесты должны выполняться одновременно с любыми другими модульными тестами.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

IMO, с точки зрения модульного тестирования, мы должны , а не сосредоточиться на тестировании того, какой поток запущен в данный момент.Цель написания тестовых примеров - убедиться, что отдельные единицы исходного кода работают должным образом, поэтому мы должны сосредоточиться на результатах индивидуально, а не заботиться о какой-либо другой функциональности зависимого уровня (сервиса);Вот почему в модульном тестировании существует понятие mocking !Если SUT (тестируемая система) использует сервис, который имеет дело с асинхронными задачами, вы должны поиздеваться над ним, опять же, мы индивидуально фокусируемся на тестировании конкретной единицы исходного кода.

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

class MyViewController: UIViewController {
    let networkManager = NetworkManager()

    func doSomething() {
        networkManager.getWhatever { isSuccess in
            // here is the side effect
        }
    }
}

class NetworkManager {
    func getWhatever(callback: (Bool) -> Void) {
        //...
    }
}

Когда мы стремимся протестировать doSomething, нам не нужно заботиться о методе getWhatever, поэтому мысмоделируйте NetworkManager и предоставьте соответствующую реализацию для нашего теста;Не имеет значения, в каком потоке выполняется обратный вызов getWhatever, вместо этого здесь утверждается, что побочные эффекты doSomething возникают при получении успеха или неудачи из getWhatever, не обращая внимания на его реализацию.,

Однако, если необходимо протестировать асинхронную задачу, вы можете использовать expectations для этого, тем не менее, ее использование должно быть с целью наблюдения за отдельным асинхронным кодом беззависимости.


Я бы согласился с вами, что это скорее интеграционное тестирование.В таком случае вы можете использовать утверждение свойства Thread.isMainThread:

Возвращает логическое значение, которое указывает, является ли текущий поток основным потоком.

0 голосов
/ 21 декабря 2018

Внутри службы есть вызов:

DispatchQueue.main.async {
    failure(error)
}

Он запускается во время тестирования.Таким образом, существует задержка, которая нарушает правило, согласно которому модульные тесты должны быть быстрыми, и модульные тесты должны выполняться одновременно с любыми другими модульными тестами.

Этот ответ объясняет, что такое единица измерениятест.

0 голосов
/ 14 декабря 2018

Работа слоя UI заключается в том, чтобы он обновлял только интерфейс основного потока.Вы хотите ограничить работу над основным потоком до минимума (в основном, только пользовательский интерфейс).Ваш обратный вызов, скорее всего, будет выполнять много другой обработки.Было бы плохой практикой помещать все это в основной поток, только потому, что это требуется для небольшой части этих задач (изменения пользовательского интерфейса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...