1
resposta

Cuckoo e Protocols

Olá, eu gostaria de testar um viewModel no meu viewController. No meu controller, a variavel viewModel é do tipo ViewModelProtocol, para somente acessar as funções dentro desse protocol, porém, quando eu tento usar o mock dessa viewModel, não funciona, pois, ou a minha viewModel não extende o protocol do mock ou minha class viewModel não entra em conformidade com o protocol mock.

Digamos que esse seja o meu arquivo da viewModel:

protocol ViewModelProtocol: class {
    func somehing()
}

class ViewModel {
    ...
}

extends ViewModel: ViewModelProtocol {
    func something() {
        ...
    }
}

Digamos que esse seja o meu arquivo da viewController:

/*
@ ViewController
*/
let viewModel: ViewModelProtocol!

override func viewDidLoad() {
    super.viewDidLoad()

    viewModel = ViewModel()
}

Agora... no meu teste, eu estou tentando fazer assim:

class FavoritesViewControllerTests: XCTestCase {

    var sut: ViewController!
    var viewModel: MockViewModelProtocol!

    override func setUp() {
        super.setUp()

        viewModel = MockViewModel()    // ERRO -> Cannot assign value of type 'MockViewModel' to type 'MockViewModelProtocol?'

        sut = ViewController.initiate(viewModel: viewModel) // Função que pega o controller da storyboard e retorna o controller
    }

    override func tearDown() {
        super.tearDown()
    }

    func testTableViewNaoDeveEstarNilAposViewDidLoad() {
        _ = sut.view // Força o evento viewDidLoad

        XCTAssertNotNil(sut.favoritesTableView)
    }

    func testDeveRetornarUmFavotiroSalvos() {
        let favAddress = FavoriteAddress(
            alias: "Academia",
            address: "Av. Padre Tomé, 200",
            placeID: "ChIJo_ZyOxF5GZURx8wIeRij3aI",
            number: "200",
            latitude: "-30.03063229999999",
            longitude: "-51.2359334",
            id: "T5hB5gy7XQmanCHOjuVuvh7CoXX1MvWc599Q")

        let academia = FavoritesCellViewModel(favorite: favAddress)

        stub(viewModel) { mock in
            when(mock.something).thenReturn([favAddress])
        }
    }

}

Se eu tentei substituir o tipo da viewModel para ViewModelProtocol, o stub não funciona.

Alguém poderia me dar uma luz em como trabalhar com protocols ? Obrigado

1 resposta

Oi Diego, tudo bem ?

Cara eu vi que sua dúvida é um pouco antiga, será que tu já resolveu ? Se sim pode compartilhar conosco ?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software