Дождитесь отправки основной очереди, прежде чем продолжить модульное тестирование - PullRequest
0 голосов
/ 09 марта 2020

У меня есть этот метод в классе:

func handleResp(_ dataGotten: Result<Response?, Error>) {
      ....

           DispatchQueue.main.async {
              ....
                  GlobalStaticStruct.code = 7
              ...
            }
        }
    }

А затем в моем модульном тестировании у меня есть этот код:

func testhandleResp() {

        subject = SomeClass()
        subject.handleResp(successResponse)
        XCTAssertNotNil(GlobalStaticStruct.code)
    }

Мне нужно иметь возможность проверить, что GlobalStaticStruct.code - это не ноль, а с кодом, так как тест завершается до главной очереди, поэтому поле постоянно равно нулю.

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

Как мне сделать мой тест, чтобы дождаться запуска и завершения основного метода, и ТОГДА проверить значение GlobalStaticStruct.code ?

Заранее спасибо!

1 Ответ

1 голос
/ 09 марта 2020

Специально для очереди main вы можете использовать тот факт, что это последовательная очередь. Поэтому, если вы запланируете проверку на выполнение в той же очереди после handleResp, ваша проверка пройдет. И вы можете использовать ожидание для синхронизации теста после этой проверки:

func testhandleResp() {

    subject = SomeClass()
    subject.handleResp(successResponse) 
    let expectation = XCTestExpectation()
    DispatchQueue.main.async { // scheduled after subject.handleResp
        XCTAssertNotNil(GlobalStaticStruct.code)
        expectation.fulfill()
    }
    wait(for: [expectation], timeout: 10.0)
}

Если бы это был какой-либо другой (возможно, параллельный) поток, вы могли бы сделать то же самое, но запланировать блок проверки для запуска позже, используя schedule(after:...

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