2016-04-29 6 views
3

У меня есть простая последовательность наблюдения RxSwift, которую я пытаюсь выполнить.Тестирование модуля RxSwift

var pass = false 
    _ = service!.authenticate().subscribeNext { res in 
     XCTAssert(res.tokenValue == "abc123") 
     pass = true 
    } 
    XCTAssertTrue(pass) 

Этот тест будет прерываться с перерывами, как если бы блок subscribeNext не всегда попадал. Любые идеи о том, что я делаю неправильно?

Edit 1

Этот Аутентифицировать вызов просто возвращаются статические данные в формате JSON и фактически не попав в сеть.

ответ

8

Ваша проблема, скорее всего, из-за любой из этих двух вопросов:

  1. теста попадет в сеть
  2. Испытание написано синхронным образом, но поведение испытываемое асинхронный.

Что касается попадания в сеть в тестах: Это, как правило, плохая идея, если вы не делаете тестирование интеграции. Сеть ненадежна, она может время ожидания или сбой. Вы можете найти более подробную информацию о том, почему поражение в сети в вашем тесте не является хорошей идеей here.

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

Вы можете переписать тест так:

Пусть обслуживание = SomeService()

let expectation = expectationWithDescription("subscribeNext called") 

_ = service!.authenticate().subscribeNext { res in 
    XCTAssert(res.tokenValue == "abc123") 
    expectation.fulfill() 
} 

waitForExpectationsWithTimeout(1) { error in 
    if let error = error { 
    XCTFail("waitForExpectationsWithTimeout errored: \(error)") 
    } 
} 

Вы можете найти более подробную информацию об асинхронных тестах here.

+0

Спасибо за ответ. Я забыл упомянуть, что он работает с макетными данными, поэтому фактического сетевого вызова нет. Я просто попробовал этот подход waitFor Expectation, и похоже, что его иногда не ударяют. Я буду продолжать смотреть. Еще раз спасибо. – dloomb

Смежные вопросы