unitarios unitarias test pruebas ios swift swift2 xctest

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?