XCTest / XCTest.h, Xcode 6'da oluşturulmuş eski projelerde bulunamadı


82

Xcode 6 Beta 2 ile oluşturmaya çalıştığım birkaç projem var. Projelerin hepsinde XCTest (Kiwi / XCTest ve Specta) kullanan ve XCTest / XCTest.h yapılamadığı için Xcode 6'da oluşturulmayan bir tür kitaplık var bulunan.

fatal error: 'XCTest/XCTest.h' file not found
#import <XCTest/XCTest.h>

XCTest.framework artık "Link Libraries with Binaries" oluşturma aşaması listesinde olmadığını fark ettim, ancak sorun değil çünkü Xcode 6 ile yeni bir proje oluşturduğumda kitaplık otomatik olarak bağlanıyor gibi görünüyor.

Belki de bazı alaka düzeyinden, XCTest'e ihtiyaç duyan bağımlılıklarımın tümü Cocoapods aracılığıyla getirilir.

Projemle güncellemem gereken, bilmediğim herhangi bir şey var mı?

Yanıtlar:


142

Not: Bu, Xcode 7'de oluşturulan herhangi bir proje için gerekli olmayabilir.

CocoaPods bunun için burada ve burada


Bunu herhangi bir CocoaPod bağımlılığı için düzeltmek için aşağıdakileri FRAMEWORK_SEARCH_PATHSXCTest gerektiren herhangi bir Pod hedefine eklemeniz gerekir (örn. Kiwi, Specta, FBSnapshotTestCase, vb.).

$(PLATFORM_DIR)/Developer/Library/Frameworks

ekran görüntüsü

Bu, sahip olabileceğiniz herhangi bir bağımlılıkta XCTest'e başvurmanıza izin verecektir. Bu, CocoaPods'un veya referans verdiğiniz Kapsülün gelecekteki bir güncellemesinde düzeltilebilir, bu nedenle daha sonra kaldırmak isteyebilirsiniz.

Xcode'un önceki sürümleri için zararlı değildir, bu nedenle kullanımı güvenli olmalıdır.


Teşekkür ederim squarefrog. İlgili konu burada
fatuhoku

1
Bir sonraki sürüm ne zaman planlanıyor?
fatuhoku

6
Bu xcode 6 GM'de KIM ile çalışmıyor gibi görünüyor ..?
Thomas Clowes

3
"Xcode 7 ile ilgili değil" fikrine katılmıyorum. Xcode 7.1'de sorun yaşadım. Yukarıda belirtildiği gibi bu çerçeve arama yolunu ekledikten sonra sorun ortadan kalktı. Xcode 7'de başlatılan bir projenin sorunu olmayacağını varsayıyorum, ancak buradaki soru daha yeni Xcodes'te eski projeler oluşturmaktır.
Jerry Krinock

1
XCode 9'dan itibaren, FRAMEWORK_SEARCH_PATHS derleme ayarını $ (DEVELOPER_FRAMEWORKS_DIR) ve $ (devralınan) olarak ayarlamalısınız
berbie

40

Dosyaları bir projede taşıyordum. Tek yapmanız gereken tek şey test dosyaları seçmek olduğunu xxxTests.mvb ve file inspectorseçmek targetolarak testdeğil, normal bir hedef olarak.


1
Tam olarak bana ne oldu. Onu taşıdığımda dosyanın hedefinin "değiştiğini" fark etmedim. Nasıl taşındığına bağlı olarak düşünmeliydim (Xcode'da silin ve yeniden ekleyin). Teşekkürler.
chadbag

1
benim için çalışan basit cevap. Dosyalarımı yeniden adlandırırken sorunlar yaşadım ve bu benim durumumdaki çözümdü.
Simon

17

XCTest'in yalnızca bir test hedefi için mevcut olduğunu fark ettim (Xcode 6'da). XCTest'i başka bir hedef için kullanıyorsanız (herhangi bir nedenle), XCTest.h not foundhatayı göreceksiniz .


Bu kadar. Cocoapods, statik kitaplık projeleri / hedefleri oluşturur. İyi bul!
Erik Kerber

1
Büyük olasılıkla XCTest ile ilgili tüm kodu bir test hedefine taşımanız gerekecektir.
Mustafa

Projenize Kiwi veya Specta eklemek için CocoaPods kullanıyorsanız bu zor.
squarefrog

2
Peki ... düzeltme nedir?
fatuhoku

12

Bu hata, XCTest'in test hedefinin dışında kullanıldığı bir dosya eklediğinizde ortaya çıkar. Bunu AppCode'da düzeltmek için, herhangi bir şüpheli dosyaya sağ tıklayıp 'Hedefleri Yönet'i seçebilir ve ardından sadece test hedefinin işaretlendiğinden emin olabilirsiniz.


Bu problemle birden çok kez karşılaştım.
pshah

Bu, dosyaları bir projede taşıdıktan ve yanlış hedef altına yeniden ekledikten sonra başıma geldi.
Giles

11

@squarefrog doğru cevaba sahip, ancak bölmelerinizi her güncellediğinizde bunu elle yapmaya devam etmeniz gerekecek

Bunu pod dosyanıza eklerseniz, sizin için otomatik olarak ekstra yolu ekleyecektir. Örneğin eklemek istiyorsa $(PLATFORM_DIR)/Developer/Library/Frameworksiçin FRAMEWORK_SEARCH_PATHSSpecta için:

post_install do |installer|
    target = installer.project.targets.find { |t| t.to_s == "Pods-Tests-Specta" }
    if (target)
        target.build_configurations.each do |config|
            s = config.build_settings['FRAMEWORK_SEARCH_PATHS']
            s = [ '$(inherited)' ] if s == nil;
            s.push('$(PLATFORM_DIR)/Developer/Library/Frameworks')
            config.build_settings['FRAMEWORK_SEARCH_PATHS'] = s
        end
    else
        puts "WARNING: Pods-Tests-Specta target not found"
    end
end

"Pods-Tests-Specta"Proje ayarlarınıza uyacak şekilde değişiklik yapmanız gerekebileceğini veya @squarefrog'un her hedef üzerinde yinelemek için önerdiği döngüyü kullanmanız gerekebileceğini unutmayın.
pix0r

1
Yanlış söyledim - @squarefrog bir döngü önermedi. Demek istediğim, @ deanWombourne çözümündeki 2-3 satırlarını şu ile değiştirin: installer.project.targets.each do |targettüm hedeflerin üzerinde döngü yapmak ve değişikliği uygulamak.
pix0r

2

Bir süre sonra XCTest çerçevesini derleme aşamalarından içe aktardıktan ve sorunu çözdükten sonra aynı sorunla karşılaştım.

Derleme aşamaları-> XCTest.Framework> temizleyin ve çalıştırın. Umarım birine yardımcı olur ..

referans için ... XCTest'i mevcut projeye aktarın


Bu benim için çalıştı, ancak yeni testler için Hedef Ayarlarına da gitmem gerekiyordu ve Genel sekmesinde uygulamanın API'larını test etmek için kutuyu işaretledim.
Fran K.

1

Yazma tarihi itibariyle, Cocoapods'un (0.33.1) en son sürümünde sorun için bir düzeltme bulunmuyor.

Ancak en son sürüm bunu yapıyor.

Cocoapods'un en son sürümünü kaynaktan ayarlamak için bu kılavuzu izleyin . Onu pod-devbölmelerin gem yüklü sürümünden ayırmak için benimkini (kılavuzda anlatılan) arıyorum .

Bu yaklaşımın yararı, Podfile'ınızda fazladan komut dosyası oluşturmanıza gerek olmamasıdır. Her pod-dev installzamanki gibi bir tane yapmayı hatırlamalısın pod install.


1

Bir XCTest'e sahip olmanın en iyi yolu, onu Test Gezgini'nden eklemektir (sol bölmedeki 5. simge).

Böylelikle, yeni xx.mtest dosyası bir uygulamayı (sol bölmede> Hedef, Sarmalayıcı Uzantı: uygulama) değil (Sarmalayıcı Uzantı: xctest) bir uygulamayı hedeflemiyor (sağ bölmede)

  • XCTest.framework Kırmızı renkte kalır,
  • Bazı değişiklikler nedeniyle hatayı alabilirsiniz 'XCTest/XCTest.h' file not found, bunun nedeni dosyanızın bir uygulamayı hedeflemesi gerektiğidir.

0

Bu bulduğum en kolay çözüm. Proje değişikliği gerekmez. Ve bu değişiklik bir sonraki Xcode yükseltmenize kadar devam edecek:

cd /Applications/Xcode6-Beta7.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk/Developer/Library/Frameworks
ln -s ../../../../../Library/Frameworks/XCTest.framework

Bunun dezavantajı, projenizi başkalarıyla paylaşırsanız, bu eylemi gerçekleştirmelerini sağlamak zorunda olduğunuzdan, her Xcode güncellemesi olduğunda. Bu, Cocoapods uygulamasıyla ilgili bir sorundur, bu nedenle Cocoapods kullanarak çözmek mantıklıdır!
squarefrog

Kabul. Ve bu mükemmel değil. Ama bu gerçekten kolay ve sahip olduğunuz kapsül sayısına göre iyi ölçekleniyor (O (1)). Xcode 6 sürümlerinin sayısı da sınırlı olsa iyi olur :-)
Steven Kramer

Çerçeve arama yollarına yol eklemek onu kesmiyor gibi görünüyor: testler oluşturulacak, ancak çalışmayacak. Görünüşe göre test paketinin XCTest çerçevesini çözememesi nedeniyle.
Steven Kramer

0

Cocoapod'ların olmadığı bir projede (yani OP'nin sorusuna doğrudan cevap vermemek, ancak belki benim veya gelecekte başkaları için faydalı olabilir), aynı sorunu yaşadık. Önceki OCTest öğelerimizi XCTest ile değiştirerek çözüldü. Örneğin, MyApp.xcodeproj / project.pbxproj dosyasında bu fark vardır (kısaltılmış); - path = MyAppUnitTests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; + path = MyAppUnitTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.