2011-03-19 23 views
12

hakkında hemfikir değil Bir iPhone uygulaması için basit bir OCUnit testi ile oynuyordum ve sadece uygulama temsilcisinin, beklediğim sınıfın bir örneği olduğunu iddia etmek istedim. Bu testin çok yararlı olmasını beklemiyordum, ancak Objective C ile ilgili bir yanlış anlaşılmayı ortaya çıkarmıştım.isKindOfClass ve NSStringFromClass, UIApplicationDelegate

Öncelikle delege referansı alıyorum. Sonra geri gelen şeyin sınıf adını kaydederim. Benim durumumda, çıktı doğru olarak "app delegate'ın sınıf adı CalculatorAppDelegate" yazıyor. Bununla birlikte, bir sonraki satırdaki iddia başarısız olur ve nedenini anlamıyorum. isKindOfClass false döndürür iken

- (void)testAppDelegate 
{ 
    id appDelegate = [[UIApplication sharedApplication] delegate]; 
    NSLog(@"app delegate's class name is %@", NSStringFromClass([appDelegate class])); 
    NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 
    NSLog(@"class == class %i", [appDelegate class] == [CalculatorAppDelegate class]); 
    STAssertTrue([appDelegate isKindOfClass:[CalculatorAppDelegate class]], @"wtf"); 
} 

Hangi şartlar, NSStringFromClass() doğru sınıf adını döndürmek için neden olabilir? faydası ancak a eğer

NSLog(@"is it member? %i", [appDelegate isMemberOfClass:[CalculatorAppDelegate class]]); 

emin: operasyonun dönüş değeri

NSLog(@"is it kind? %i", [appDelegate isKindOfClass:[CalculatorAppDelegate class]]); 

ve hatta onun bir üyesi test edebilirsiniz neyin

2011-03-19 15:51:13.864 Calculator[40092:207] app delegate's class name is CalculatorAppDelegate 
2011-03-19 15:51:13.864 Calculator[40092:207] is it kind? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] is it member? 0 
2011-03-19 15:51:13.865 Calculator[40092:207] class == class 0 
/Users/pohl/Developer/FoundationCalculator/CalculatorTests/CalculatorBrainTests.m:37: error: -[CalculatorBrainTests testAppDelegate] : "[appDelegate isKindOfClass:[CalculatorAppDelegate class]]" should be true. wtf 
Test Case '-[CalculatorBrainTests testAppDelegate]' failed (0.002 seconds). 

cevap

11

Test hedefinizi doğru bir şekilde yapılandırmadınız. Eğer this guide for unit testing applications'u izlediyseniz, 3 hedefiniz olmalıdır: Hesap Makinesi, Hesap Makinesi Testleri ve Hesap Makinesi Test. Hesap Makinesi Testleri'daki 'yapı aşamaları' bölümünü kontrol edin. 'Derleme Kaynakları' içinde sadece SenTestCase kaynak dosyalarında listelenmelidir. CalculatorAppDelegate.m ve diğer dosyaları buraya eklediniz - bu, aynı kaynak dosyalarının yinelenen derlemelerine yol açacak ve daha sonra CalculatorTesting hedefini oluştururken aynı uygulamaya bağlanır. Bu, iddialarınızın neden başarısız olduğunu açıklıyor.

DÜZENLEME: Sadece Sadece> Düzenle Düzenleri Project gitmek Xcode 4'te CalculatorTesting hedef ihtiyaç ... ve birim test demeti Testi bölümünde listelenen emin olun olmadığını kavramış . Daha sonra Cmd-U ile birim testleri yapabilirsiniz.

+0

Bu projeyi XCode4'te yeni oluşturdum ve otomatik olarak birim test hedefini oluşturdum. Mükemmel bir şekilde çalışmakta olan pek çok iddiayla ilgili birkaç testim var. Sadece bu başarısız olan tek bir iddia. Hedefimin doğru şekilde ayarlanmamış olması hâlâ olabilir mi?Herhangi bir CalculatorTesting hedefi yok gibi görünüyor, bu yüzden yukarıdaki iddia bir cihazda çalışması gereken bir uygulama testi olarak adlandırdıkları şeydir? İlgili bir notta, bağlandığınız sayfadaki talimatlar XCode 4'ün hedefleri nasıl ayarladığıyla eşleşmiyor, bence. 4'te hedefler nasıl yapılacağına dair ipuçları var mı? – pohl

+1

Hedeflerinizi doğru şekilde ayarlamadığınızdan eminim. Ben de Xcode 4 ile çalışıyorum ve sorununuzu test ettim. Xcode 4'te proje genel bakışında normal uygulama hedefinizi seçmeli ve çoğaltmalısınız (Cmd-D). CalculatorTesting adını verin ve OCUnit test hedefini bağımlılık olarak ekleyin. Aktif şemayı yeni hedefiniz olacak şekilde ayarlayın ve bu şemayı düzenleyin. Soldaki Testi seçin ve test paketinizi buraya ekleyin. Artık uygulama testlerinizi Cmd-U ile çalıştırabilirsiniz. – Felix

+0

Bana zaman ayırdığınız için teşekkür ederim. Şemayı düzenlediğimde ve Test bölümüne baktığımda, CalculatorTests paketimin doğru bir şekilde listelendiğini görebilir ve tanımladığım test sınıflarını ve yöntemleri gösterir. Net olmak gerekirse: Birim testleri Cmd-U ile çalıştırabiliyorum. Toplam 38 iddia içeren 11 test yöntemim var ve bunların hepsi doğru çalışıyor ... bunun dışında. Doğru bir şekilde yapılandırılmış bir test hedefine sahip olmadıysam, soruma yapıştırdığım NSLog() iletileri bile çalıştırılmış olabilir mi? – pohl

1

oturumu deneyin başlangıç ​​noktası

+0

türünde mi? 0 üye mi? 0 – pohl

+1

= [appDelegate sınıfı] == [CalculatorAppDelegate sınıfı] 'lütfen –

+1

İyi fikir. '0 için NSLog çıktı (@ "% i", [appDelegate sınıfı] == [CalculatorAppDelegate sınıfı]); ' – pohl