ios स्विफ्ट में यूनिट परीक्षण के लिए सिंगलटन मजाक में परेशानी



swift swift2 (1)

हैलो, मैं एक एकल गीत का उपयोग करने की कोशिश कर रहा हूं जिसका उपयोग मैं परीक्षण करने के लिए करता हूं कि विभिन्न दृश्य नियंत्रक वास्तव में ठीक तरीके से कॉल करते हैं।

मेरे पास सिंगलटन घोषित है जैसे कि

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

    [...]
}

देखें नियंत्रक जो सिंगलटन का उपयोग करते हैं, यह एक आलसी कम्प्यूटेड प्रॉपर्टी पर सेट होता है:

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

    [...]
}

मैं अपने XCTestCase में मॉडल प्रबंधक सिंगलटन को नकली करने की कोशिश कर रहा हूं:

[...]

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

expect() अभिपुष्टि में मुझे Value of type 'ModelsManager' has no member 'flag' मिल रहा है Value of type 'ModelsManager' has no member 'flag'

मुझे यहां क्या समझ नहीं आ रहा है?

संपादित करें ऐसा प्रतीत होता है कि जो कुछ मैं याद कर रहा था वह ModelsManagerMock.sharedInstance अभी भी IRModelsManager() से IRModelsManager() देता है इस तथ्य के कारण कि static उप-कक्षाओं द्वारा ओवरराइट नहीं किया जा सकता है, मैं इसे कैसे प्राप्त करूं?


सही समाधान में आपका सिंगलटन उप-क्लासिंग नहीं होना चाहिए। एक निजी init विधि के साथ सिंगलटन बनाना आपको इस विधि को उप-वर्ग से रोक देता है।

यदि लक्ष्य सिंगलटन की मौजूदा कार्यक्षमता का परीक्षण करना है, तो आप इसके लिए अतिरिक्त कार्यक्षमता क्यों जोड़ना चाहते हैं? सिंगलटन का मुख्य बिंदु यह है कि केवल एक ही होना चाहिए यदि आप एक से अधिक का समर्थन करना चाहते हैं, तो आपको इसे सिंगलटन नहीं करना चाहिए, भले ही यह परीक्षण के लिए ही हो।





xctest