ios - test - pruebas unitarias swift 3
Problema de burlarse de singleton para pruebas unitarias en Swift (1)
La solución correcta debe incluir no subclasificar su singleton. La creación de un singleton con un método privado init le prohíbe la subclasificación de este método.
Si el objetivo es probar la funcionalidad actual del singleton, ¿por qué quiere agregarle funcionalidad adicional? El punto clave de un singleton es que solo debería haber uno. Si desea admitir más de uno, no debe convertirlo en singleton, incluso si es solo para pruebas.
Hola, estoy tratando de burlarme de uno de los singletons que uso para probar que varios controladores de vista realmente llaman correctamente sus métodos.
Tengo el singleton declarado como tal
public class ModelsManager {
static let sharedInstance = ModelsManager()
private init() {}
[...]
}
En los controladores de vista que usan el singleton, se establece en una propiedad calculada diferida como tal:
class MyViewController: UIViewController {
lazy var Models = {
return ModelsManager.sharedInstance
}()
[...]
}
Estoy intentando simular el singleton de ModelsManager en mi XCTestCase como tal:
[...]
func testSomething() {
let vc = MyViewController(nibName: "MyView", bundle: nil)
var mockModelsManager = ModelsManagerMock.sharedInstance
vc.Models = mockModelsManager
[... do something that calls a function in ModelsManager...]
expect(mockModelsManager.flag) == true // Using Nimble here
}
class ModelsManagerMock: ModelsManager {
var flag = false
override func test() {
flag = true
}
}
En la aserción de expect()
que Value of type ''ModelsManager'' has no member ''flag''
¿Que me estoy perdiendo aqui?
EDITAR Parece que lo que me faltaba era ModelsManagerMock.sharedInstance
aún devuelve IRModelsManager()
de la superclase. Debido al hecho de que la static
no puede ser sobrescrita por subclases, ¿cómo puedo evitar esto?