2011-11-25 30 views
6

NSCoding ve daha kesin olarak NSKeyedArchiver kullanılarak veriler kalıcı bir iOS uygulamasına sahibim. Bu uygulama App Store'da zaten mevcut.NSCoding nasıl birim testi yapılır?

Uygulamanın 2. sürümü üzerinde çalışıyorum ve veri modeli değişmeli. Bu yüzden veri modeli geçişini ele almam gerekiyor. Birim testleri ile kapsanmasını istiyorum.

Testlerimde, eski veri modeli ile kalıcı veriyi dinamik olarak oluşturmak, geçişi başlatmak ve her şeyin yolunda gittiğini görmek istiyorum.

Halen bir nesneyi arşivleme şuna benzer:

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

sorundur, MyDataModelObject yeniden çarpanlara hatta uygulamanın 2. sürümünde silinebilir. Bu yüzden sınamalarımda 'eski sürüm arşivi' oluşturmak için bu sınıfı kullanamıyorum.

Bu sınıfı kullanmadan, bir sınıfın encodeWithCoder: yönteminde ne yapıldığını simüle etmenin bir yolu var mı?


Ne elde etmek istiyorum aşağıdaki

- 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"); 
} 

cevap

1

Gerçekten o yüzden sana iki cevap verecektir sorunuzu anlamıyorum: Sen bir örneğini önyükleyebilir

NSDictionary, eski sınıfınızla kullanacağınız anahtarlarla/değerlerle ve sadece yeni anahtarlı bir arşivleyici oluşturarak, tüm anahtarlar arasında geçiş yapın ve arşivleyin.

Ayrıca tüm anahtarları almak için herhangi bir sınıfın -attributeKeys yöntemini almak ve daha sonra muhtemelen bir arşiv simüle etmek için bu kodu kullanabilirsiniz

: NSKeyedArchiver yöntemini -setClass:forClassName: veri geçişini noktada

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]; 

sahiptir ve mümkün Yeni nesnenizdeki tüm eski anahtarlarınızı farklı özelliklere dönüştürmek için destekleyin.

+0

Cevabınız için teşekkürler, daha net (umarım) – David

+1

attributeKeys, iOS'ta bulunmayan NSClassDescription'ın bir parçasıdır. – quellish