2011-11-25 9 views
6

Mam aplikację na iOS z danymi utrzymywanymi przy użyciu NSCoding, a dokładniej NSKeyedArchiver. Ta aplikacja jest już dostępna w App Store.Jak przeprowadzić test NSCoding na urządzeniu?

Pracuję nad wersją 2 aplikacji i model danych powinien się zmienić. Potrzebuję więc obsługi migracji modelu danych. Chcę, żeby był objęty testami jednostkowymi.

W swoich testach chcę dynamicznie generować utrwalone dane przy użyciu starego modelu danych, przeprowadzić migrację i sprawdzić, czy wszystko poszło dobrze.

Obecnie archiwizacji obiekt wygląda tak:

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

Problem polega na tym, MyDataModelObject może być ponownie uwzględnione lub nawet usunięte w wersji 2 aplikacji. Dlatego nie mogę używać tej klasy w moich testach do generowania "starego archiwum wersji".

Czy istnieje sposób, aby zasymulować, co robi się metodą encodeWithCoder: klasy bez użycia tej klasy?


Co chciałbym osiągnąć jest następujące

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

Odpowiedz

1

ja nie bardzo rozumiem Twoje pytanie, więc dam ci dwie odpowiedzi:

Można preload instancję NSDictionary z kluczami/wartościami, których używałbyś ze starą klasą i po prostu tworzysz nowy archiwizator z kluczem, przeglądasz wszystkie klucze i archiwizujesz je.

Można również uzyskać -attributeKeys metodę dowolnej klasy, aby uzyskać wszystkie klucze, a następnie ewentualnie użyć tego kodu, aby symulować archiwum:

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

Z punktu migracji danych, NSKeyedArchiver ma metodę -setClass:forClassName: i można obsługa wszystkich starych kluczy w nowym obiekcie w celu przetłumaczenia ich na różne właściwości.

+0

Dziękuję za odpowiedź, zredagowałem pytanie, aby było bardziej zrozumiałe (mam nadzieję). – David

+1

attributeKeys jest częścią NSClassDescription, która nie istnieje w systemie iOS. – quellish

Powiązane problemy