2009-12-04 14 views
55

Bir etki alanı modeli kullanarak bir iphone uygulaması geliştirmekteyim ve şu ana kadar uygulamanın kalıcılık özelliğini kaldırdım. Çekirdek Veriler, zaten iyi tanımlanmış bir modelim olduğu için gerçekten iyi bir çözüm gibi görünüyor ama mevcut birim testlerimle bir takılmaya koşuyorum.Modellerim şimdi Core Data kullanıyorum nasıl test edilir?

- (void)test_full_name_returns_correct_string { 
    Patient *patient = [[Patient alloc] init]; 
    patient.firstName = @"charlie"; 
    patient.lastName = @"chaplin"; 
    STAssertTrue([[patient fullName] isEqualToString:@"charlie chaplin"], @"should have matched full name"); 
} 

nasıl Hasta nesne kez bu çalışma NSManagedObject uzanır ve firstName velastName özellikleri için @dynamic kullanır yapabilirsiniz: Burada

ne var şimdi basit bir örnektir?

Çekirdek Veri ile bu türden bir başkası var mı? Teşekkürler.

cevap

84

Her bir yöntemde veya -setUp numaralı belgede bir Çekirdek Veri yığını oluşturmanız ve ardından yırtılamanız gerekir. Bir NSInMemoryPersistentStore kullanmak, ünite testleriniz için işleri hızlı ve bellek içinde tutacaktır. TestCase alt sınıfınıza @property (nonatomic,retain) NSManagedObjectContext *moc ekleyin. senin varlık Person adlı varsayarak

- (void)test_full_name_returns_correct_string { 
    Patient *patient = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.moc]; 

    patient.firstName = @"charlie"; 
    patient.lastName = @"chaplin"; 
    STAssertTrue([[patient fullName] isEqualToString:@"charlie chaplin"], @"should have matched full name"); 
} 

: Sonra: gibi

- (void)setUp { 
    NSManagedObjectModel *mom = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:bundleContainingXCDataModel]]; 
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; 
    STAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL] ? YES : NO, @"Should be able to add in-memory store");  
    self.moc = [[NSManagedObjectContext alloc] init]; 
    self.moc.persistentStoreCoordinator = psc; 

    [mom release]; 
    [psc release]; 

} 

- (void)tearDown { 
    self.moc = nil; 
} 

Kişisel test yöntemi daha sonra görünüyor. Bu arada, yöntem sürümünüzde bir bellek sızıntısı vardı; Çekirdek Olmayan Veri sürümünde hasta -release 'd olmalıdır (insertNewObjectForEntityForName:managedObjectContext:, otomatik olarak çalıştırılan örneği döndürür).

+0

Teşekkür: Burada

- (void)setUp { [super setUp]; NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"SimpleInvoice" withExtension:@"momd"]; NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:mom]; XCTAssertTrue([psc addPersistentStoreWithType:NSInMemoryStoreType configuration:nil URL:nil options:nil error:NULL] ? YES : NO, @"Should be able to add in-memory store"); self.moc = [[NSManagedObjectContext alloc] init]; self.moc.persistentStoreCoordinator = psc; } 

örnek testi durumdur. Bu rotaya gideceğim. Bellek sızıntısı hakkında, ünite testlerimde bellek temizlemekten rahatsız olmadım. Bültenler olmadan bana göre daha okunaklı görünüyor. Testlerin sızdırmasını engellemek için bir fayda var mı? –

+2

Testleriniz sızıyorsa, * diğer * kodunuzu sızıntıya karşı test etmek için ünite test takımınızı kullanmak gerçekten zordur. Aletler, test kodunuzda aynı sınıfların gereksiz (ama kasıtlı) sızıntılarını * temizlerseniz * temel olarak yararsız olan bir sızıntı analizörüne sahiptir. –

+3

Sanırım bir süre sonra tutma/bırakma kodunun bilinçli görüşten kaybolduğunu göreceksiniz. Artık nadiren fark ediyorum - eksik olmadığı sürece. –

22

Yukarıdaki cevabı Barry Wark tarafından kullandım, ancak XCode5, iOS7 mevcut projeleriyle çalışmasını sağlamak için bazı değişiklikler yapmak zorundaydım.

mülkiyet

aynı kaldı: Kurulum vardı

@interface SIDataTest : XCTestCase 
    @property (nonatomic,retain) NSManagedObjectContext *moc; 
@end 

aslında bir modeli URL sağlamak ikincisi serbest her şeyden önce değiştirmek ve zorundaydı için. Yardım için

- (void)testCreateNew 
{ 
    Invoice *newInvoice = [NSEntityDescription insertNewObjectForEntityForName:@"Invoice" inManagedObjectContext:self.moc]; 
    newInvoice.dueDate = [NSDate date]; 
    NSString* title = [[NSString alloc] initWithFormat:@"Invoice %@", @112]; 
    newInvoice.title = title; 

    // Save the context. 
    NSError *error = nil; 
    if (![self.moc save:&error]) { 
     // Replace this implementation with code to handle the error appropriately. 
     // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
     XCTFail(@"Error saving in \"%s\" : %@, %@", __PRETTY_FUNCTION__, error, [error userInfo]); 
    } 
    XCTAssertFalse(self.moc.hasChanges,"All the changes should be saved"); 
} 
İlgili konular