2011-11-25 12 views
6

मेरे पास एनएससीओडी का उपयोग करके जारी किए गए डेटा के साथ एक आईओएस एप्लीकेशन है और अधिक सटीक NSKeyedArchiver है। यह एप्लिकेशन ऐप स्टोर पर पहले से ही उपलब्ध है।यूनिट परीक्षण एनएससीओडी कैसे करें?

मैं एप्लिकेशन के संस्करण 2 पर काम कर रहा हूं और डेटा मॉडल बदलना चाहिए। इसलिए मुझे डेटा मॉडल माइग्रेशन को संभालने की ज़रूरत है। मैं इसे यूनिट परीक्षणों से ढंकना चाहता हूं।

मेरे परीक्षणों में, मैं गतिशील रूप से पुराने डेटा मॉडल के साथ लगातार डेटा उत्पन्न करना चाहता हूं, माइग्रेशन लॉन्च करना चाहता हूं और देख सकता हूं कि सब ठीक हो गया है या नहीं।

वर्तमान में, एक वस्तु संग्रह इस तरह दिखता है:

MyDataModelObject *object = .... 
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:object forKey:key]; 
[archiver finishEncoding]; 

समस्या है, MyDataModelObject जा फिर से कारक हो सकता है या यहाँ तक कि आवेदन का संस्करण 2 में नष्ट कर दिया। तो मैं 'पुराने संस्करण संग्रह' उत्पन्न करने के लिए अपने परीक्षणों में इस कक्षा का उपयोग नहीं कर सकता।

क्या इस वर्ग का उपयोग किए बिना कक्षा के encodeWithCoder: विधि में क्या किया गया है अनुकरण करने का कोई तरीका है?


क्या मैं प्राप्त करने के लिए चाहते हैं निम्नलिखित

- testMigrationFrom_v1_to_v2 { 
    // simulate an archive with v1 data model 
    // I want this part of the code to be as simple as possible 
    // I don't want to rely on old classes to generate the archive 
    NSDictionary *person = ... // { firstName: John, lastName: Doe } 
    NSDictionary *adress = ... // { street: 1 down street, city: Butterfly City } 
    [person setObject:adress forKey:@"adress"]; 

    // there's something missing to tell the archiever that: 
    // - person is of type OldPersonDataModel 
    // - adress is of type OldAdressDataModel 

    [archiver encodeObject:person forKey:@"somePerson"]; 
    // at this point, I would like the archive file to contain : 
    // a person object of type OldPersonDataModel, that has an adress object of type OldAdressModel 

    NewPersonModel *newPerson = [Migration readDataFromV1]; 

    // assertions 
    NSAssert(newPerson.firstName, @"John"); 
    NSAssert(newPerson.lastName, @"Doe"); 
} 

उत्तर

1

मैं वास्तव में अपने प्रश्न समझ में नहीं आता तो मैं आपको दो जवाब दे देंगे:

आप का एक उदाहरण से लोड कर सकता NSDictionary कुंजी/मानों के साथ आप अपनी पुरानी कक्षा के साथ उपयोग करेंगे और बस एक नई कुंजी संग्रहक बनाएं, सभी चाबियों के माध्यम से लूप करें और इसे संग्रहित करें।

आप किसी भी वर्ग के -attributeKeys विधि प्राप्त कर सकते हैं सभी कुंजियों पाने के लिए और उसके बाद संभवतः एक संग्रह अनुकरण करने के लिए इस कोड का उपयोग:

NSKeyedArchiver *archive = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; 
[archiver encodeObject:object forKey:key]; 
for (NSString *key in object.attributeKeys) { 
    [archive encodeObject:[object valueForKey:key] forKey:key]; 
} 
[archive finishEncoding]; 

डेटा माइग्रेट करने की बात पर, NSKeyedArchiver विधि -setClass:forClassName: है और आप कर सकते हैं अपनी नई ऑब्जेक्ट में अपनी सभी पुरानी कुंजियों को विभिन्न गुणों में अनुवाद करने के लिए समर्थन करें।

+0

आपके उत्तर के लिए धन्यवाद, मैंने इसे और अधिक स्पष्ट करने के लिए प्रश्न संपादित किया (उम्मीद है) – David

+1

विशेषताएँ केएस एनएससीलास डिस्क्रिप्शन का हिस्सा है, जो आईओएस पर मौजूद नहीं है। – quellish

संबंधित मुद्दे