2016-06-08 29 views
0

В настоящее время я добавляю много модульных тестов в свое приложение, чтобы проверить, работает ли WS в рабочем состоянии.Xcode Unit Testing, wait in `class setUp()`

Я отлично знаю, как подождать внутри тестаMethod, используя expectations.

Что я хочу, реже. У меня есть тестовый пример, который работает с данными пользователей. Чтобы быть уверенным в состоянии этого пользователя, я хочу, чтобы создать полностью новый пользователь перед случае (и не перед каждым испытанием)

Так что я хочу использовать

public class func setUp() { 
    //call here WS (async call) 
} 

Мой вопрос, как я am в class func, я не могу использовать expectation и waitForExpectation, потому что это методы экземпляра.

Кто-нибудь, как идея о том, как дождаться завершения WS WS перед выполнением тестов?

Спасибо!

ответ

1

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

я должен использовать вместо dispatch_group:

override class func setUp() { 
    super.setUp()    
    let group = dispatch_group_create() 
    dispatch_group_enter(group) 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)) { 
     let account = MyAccount() 
     WS.worker.createAccount(account, password: "test") { (success, error) in 
      dispatch_group_leave(group) 
     } 
    } 
    dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, Int64(50 * Double(NSEC_PER_SEC)))) 
} 
+0

Правильно, это также работает :) –

2

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

 let fakeWSCallProcessingTimeInSeconds = 2.0 
     let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(fakeWSCallProcessingTimeInSeconds * Double(NSEC_PER_SEC))) 
     let semaphore = dispatch_semaphore_create(0) 
     dispatch_after(delayTime, dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0)) { 
      dispatch_semaphore_signal(semaphore) 
     } 
     let timeoutInNanoSeconds = 5 * 1000000000 
     let timeout = dispatch_time(DISPATCH_TIME_NOW, Int64(timeoutInNanoSeconds)) 
     if dispatch_semaphore_wait(semaphore, timeout) != 0 { 
      XCTFail("WS operation timed out") 
     } 

Этот код будет фальсифицировать вебсервис вызова с 2 секунд задержки (dispatch_after), который в вашем случае должен быть заменен фактическим вызовом. После завершения вызова и создания пользовательского объекта вы используете «dispatch_semaphore_signal (семафор)», чтобы освободить объект семафора. Если он недоступен в течение 5 секунд (см. timeoutInNanoSeconds), то тест считается неудачным. Очевидно, вы можете изменить значения по своему усмотрению.

Остальные тесты будут выполняться либо после того, как семафор свободен, либо когда произойдет тайм-аут.

Подробнее о семафоре можно найти в Apple docs.