addTeardownBlock do XCTest

10 junho, 2020

O addTeardownBlock(_) é um método muito útil por ser executado ao finalizar um teste do framework XCTest. Conforme sua documentação é um bloco de código de desmontagem a ser executado após o término do método de teste atual.

Quando utilizar addTeardownBlock(_)

Visto que esse trecho de código é executado ao encerrar um teste podemos realizar diversas validações neste ponto. Uma abordagem comum é quando o teste atual cria algum recurso e precisa ser destruído ao finalizar a execução.

Uma outra alternativa é verificar se há possíveis casos de memory leaks nos objetos testados. Pelo fato do Swift trabalhar orientado à callbacks, ou completion handlers, é muito comum nos depararmos com referências cíclicas, ou classes que dependam uma da outra. Com isso, os objetos não serão liberados da memória e um memory leaks será criado.

Seguindo esse último exemplo, podemos solucionar o vazamento de memória executando o addTeardownBlock(_) para verificar se o sut está nulo. Da seguinte maneira:

...
addTeardownBlock { [weak sut] in
   XCTAssertNil(sut)
}
... 

Para que seja possível reaproveitar essa verificação em demais testes, podemos criar uma extension de XCTest com um método para verificar o vazamento de memória de qualquer instância:

import XCTest

extension XCTestCase {
    func checkMemoryLeak(for instance: AnyObject, file: StaticString = #file, line: UInt = #line) {
        addTeardownBlock { [weak instance] in
            XCTAssertNil(instance, file: file, line: line)
        }
    }
}

Os parâmetros file e line ajudam a exibir a falha direto no método de teste ao invés de apontar o erro no método da nossa extensão. Essa abordagem é útil quando o método helper possui algum assert de teste.