Restless mocking singleton for unit testing in Swift

Hello, I'm trying to mock one of the singletones that I use to verify that various view managers are actually correctly calling its methods.

I have a singleton declared as such

public class ModelsManager {
    static let sharedInstance = ModelsManager()
    private init() {}

    [...]
}

In view controllers that use singleton, it is set as a lazy computed property as such:

class MyViewController: UIViewController {
    lazy var Models = {
        return ModelsManager.sharedInstance
    }()

    [...]
}

I am trying to make fun of the SingleManager ModelManager in my XCTestCase as such:

[...]

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
    }
}

In the statement, expect()I getValue of type 'ModelsManager' has no member 'flag'

What am I missing here?

EDIT It seems like I was absent, but ModelsManagerMock.sharedInstancestill returns IRModelsManager()from the superclass. Due to the fact that staticit cannot be overwritten by subclasses, how can I get around this?

+4
1

. singleton init .

, , ? , -. , , .

-1

Source: https://habr.com/ru/post/1620151/


All Articles