lundi 7 mai 2018

iOS - Mocking UserDefault before loading the view controller

I am currently working on test for my application and I have faced a problem when mocking user defaults. Let me first show you my setup :

this is how I mock user Defaults :

class MockUserDefaults: UserDefaults {

    typealias FakeData = Dictionary<String, Any?>
    var data: FakeData

    convenience init() {
        self.init(suiteName: "mocking")!
    }

    override init?(suiteName suitename: String?) {
        data = FakeDefaults()
        UserDefaults().removePersistentDomain(forName: suitename!)
        super.init(suiteName: suitename)
    }

    override func object(forKey defaultName: String) -> Any? {
        if let data = data[defaultName] {
            return data
        }
        return nil
    }

    override func set(_ value: Any?, forKey defaultName: String) {
        if defaultName == "favs"{
            data[defaultName] = value
        }

    }

}

I have a variable in my view controller called : userDefaults, and I set it like this :

var userDefaults : UserDefaults {
        if (NSClassFromString("XCTest") != nil) {
            return MockUserDefaults()
        }
        return UserDefaults.standard
    }

I also have a variable called favoriteMovie which I set like this :

private var favoriteMovie: Favorite? {
    if let favoriteString = userDefaults.value(forKey: "favs") as? String {
        return favorites.first(where: {$0.name == favoriteString})
    }
    return nil   
}

now here's where the problem is, when I go and try to test this view controller , I need to set userDefault with an object for example :

    myviewController.userDefaults.set("avengers", forKey: "favs")

before the test runs, but the problem is that favoriteMovie variable always return nil and I need it to return an object before the test runs . Any help. Thanks in advance.

Aucun commentaire:

Enregistrer un commentaire