Xcode Unit testlerinde @testable kullanılırken “böyle bir modül yok”


168

Yakın zamanda Xcode 7 beta 5'e güncelledim. Daha önceki bir projeye birim testi eklemeyi denedim, ancak @testable import myModuleNamesatırda "Böyle bir modül [myModuleName]" yok hata mesajı alıyorum .

resim açıklamasını buraya girin

denedim

  • Projeyi OptionClean Build Folder ile temizleme
  • Yapı Seçenekleri'nde "Test Edilebilirliği Etkinleştir" (hata ayıklama) seçeneğinin Evet olarak ayarlandığını kontrol etme
  • test hedefini silme ve ardından iOS Birimi test paketini yeniden ekleme

Bunların hiçbiri bu proje için işe yaramadı (ancak başka bir projede çalışmak için test aldım). Başka kimse bu problemi yaşadı ve çözdü mü?



Xcodebuild ile komut satırından yapıyorsanız, build komutunuz için -workspace bayrağını eklediğinizden emin olun. Bu sorunu travisimde bu şekilde inşa ederek çözdüm.
Victor 'Chris' Cabral

Yanıtlar:


210

Lütfen içe aktarmaya çalıştığınız Modül Adınızı kontrol edin @testable import "ModuleName". Modül adı aynı olmalıdırTarget->Build Settings-> Product Module Name


5
Çoğu durumda, ürün modülü adı ile ilgilidir. Kontrol spaceve_
onmyway133

5
dikkatli ol -ve _. Benim projelerden biri eksi sahiptir -adına ancak modül alt çizgi vardır _yerine
berilyum

4
""fikri kullandım ve varExpected identifier in import declaration
abbood

1
@ onmyway133 süper yakındı. Benim durumumda, proje adımdan farklı bir ürün modülü adı vardı. Modül adınızı bulmak için Build Settingsprojenizi seçin (test veya UI testi değil), o zaman PRODUCT_MODULE_NAMEne ortaya @testable import
çıkıyorsa onu aramalısınız

115

Benim için çalışan cevap

Cevap, projemde derlemenin başarısız olmasına neden olan bazı hataların olmasıydı. (Bu sadece standart günlük kod hata oldu.) Hataları düzelttikten ve başka bir temiz ve inşa ettikten sonra işe yaradı.

Bu hataların ilk başta görünmediğini unutmayın. Gösterilmesini sağlamak için:

  • Size "Böyle bir modül yok" hatası veren tüm Test dosyanızı yorumlayın.
  • Projenizi tekrar çalıştırmayı deneyin.

Başka hatalar varsa, şimdi görünmelidirler. Onları düzeltin ve ardından Test dosya kodunuzu açın. Benim için "Böyle bir modül yok" hatası gitti.


Bunun diğer insanlar için sorunu çözmemesi durumunda, aşağıdakileri de deneyebilirsiniz:

Derleme klasörünü temizleme

Ürün menüsünü açın, basılı tutun Optionve "Klasörü Oluştur ..." u tıklayın.

resim açıklamasını buraya girin

Test Edilebilirliği Etkinleştir'in Evet olarak ayarlandığından emin olun

Proje Gezgini'nde proje adınızı tıklatın. Yapı Ayarları'nı seçin ve Yapı Seçenekleri'ne ilerleyin. Test Edilebilirliği Etkinleştir seçeneğinin Evet (hata ayıklama için) olduğundan emin olun.

resim açıklamasını buraya girin

Testler hedefinizi silin ve yeniden ekleyin

Başka şeyleri yaptıysanız, tahminimce muhtemelen bunu yapmanız gerekmez. Ancak bunu yaparsanız, daha önce yazdığınız Birim Testlerini kaydetmeyi unutmayın.

Proje Gezgini'nde proje adınızı tıklatın. Ardından Testler hedefinizi seçin. Silmek için alttaki eksi (-) düğmesine tıklayın.

resim açıklamasını buraya girin

Ardından artı (+) düğmesini tıklayın ve tekrar eklemek için iOS Birim Test Paketi'ni seçin. Gördüğünüz gibi, aynı şekilde bir UI Test Paketi de ekleyebilirsiniz.

Birkaç fikir daha

  • Gerekli tüm sınıfların test hedefinizin üyeleri olduğundan emin olun.
  • Gerekli tüm kütüphaneleri eklediğinizden emin olun.
  • Modül adının doğru yazıldığından emin olun ( bu cevaba bakınız ).

Veya...

İşe yarayan başka bir şey bulduysanız aşağıya bir yorum veya yanıt bırakın.

İlişkili


2
Burada aynı sorunlara sahip olmak, Xcode 7 beta 5. Ekran görüntülerinizdeki tek fark, bu çalışmayı UI test klasörüyle (benim durumumda GlimpulseUITests) almaya çalışıyorum. @Testable belki UI test hedefi ile çalışmıyor mu?
Zac

5
*** ÖNEMLİ *** Test Hedefinizi silip yeniden eklerseniz, mevcut testlerinizin üzerine yazılan boş bir test şablonu oluşturur. Bunu yapmadan önce test kaynaklarınızı kaydettiğinizden emin olun.
pauln

2
Benim için bireysel sınıflarım bile yazarken gösterilmiyordu ... Sonunda Ürün> Temiz, yeniden başlatılan XCode yaptım. Yeniden başlatıldığında, dizin oluşturmayı tamamlamak için birkaç saniye verdi ve ardından tüm referanslarımı her sınıfı test hedefinin bir üyesi olarak eklemek zorunda kalmadan gösterdi.
Rajive Jain

1
Ayrıca bunu denemediyseniz, soldaki eksik çerçevenizi tıklayın, ardından sağda "Hedef Üyelik" i seçin ve birim test hedefinize ekleyin.
albogdano

3
Ana hedefinizin -> "Ürün Modülü Adı" ayarlarını oluşturmaya gidin ve testinize aktarmaya çalıştığınız modül adıyla eşleşip eşleşmediğine bakın.
f0rz

64

Benim için sorun, testlerin iOS dağıtım hedefinin ana hedefle aynı olacak şekilde ayarlanmamış olmasıydı. Bu yüzden kontrol ettiğinizden emin olun.

Test hedefinizde:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

Bunu yaparken sonra ayarlamak zorunda Enable Bitcodeiçin Notest Bundle.
pableiros

2
Lol çalışıyor ama farklı bir hata atmıyor xcode ne kadar aptal
J. Doe

31

Bu yüzden, önceki önerilerden önerilen tüm çözümleri denedikten sonra kodumu çalışmaya başladım.

  • Projenin Derleme Ayarlarında 'Test edilebilirliği etkinleştir' seçeneğini 'EVET' olarak ayarladım
  • Projemin Yapı Ayarlarında 'Modül Tanımla' seçeneğini 'EVET' olarak ayarladım.
  • Projemdeki normal .swift dosyaları için, Uygulamam diyelim , test senaryoları yazacağım , hem ana " Uygulamam " ve Hedef Üyelik altında " UygulamamTestler " Hedeflerim var .
  • Daha sonra birim test dosyalarımı seçtim , üstte, ' XCTest'i içe aktar ' altında ' @testable import MyApp ' olarak beyan ettim ve yalnızca Hedef üyelik altındaki "MyAppUnitTests" i kontrol ettim

Ve her şey cazibe gibi çalıştı. Bu yardımcı olur umarım.


8
Test edilebilirliği etkinleştir ve Modül tanımlar, hile yaptı. Normal * .swift dosyaları için hedef üyelikleri değiştirmem gerekmiyordu.
George Yacoub

Yukarıdaki adımların hepsini yaptım ama hala böyle bir modül hatası yok. benim projem hızlı bir c karışımıdır
Mikael

@Mikael, yalnızca Objc / Swift karışım kod tabanınızdaki Swift dosyaları için testler mi yazıyorsunuz? (Son kontrol ettiğimde, '@testable import' komutunun yalnızca Obj-c / Swift kod tabanı karışımında bile yalnızca Swift dosyaları için test senaryoları yazmak için çalıştığını düşünüyorum. Muhtemelen şimdiye kadar değişmiş olabilir. burada yanılıyorsam).
Vick Swift

6
Sorunumu buldum. Test hedefimin Geçerli Mimarisi, ana hedefimin Geçerli Mimari yapılandırması ile aynı değildi. Şimdi çalışıyor. Btw, benim durumumda sadece Swift sınıflarını test ediyorum, Obj-c için denemedim
Mikael

3
Uygulama hızlı dosyalarını test hedefinize eklememelisiniz, testler yapılırken içeriği çoğaltılır.
Przemysław Wrzesiński

18

İzlenmesi gereken bir şey, modül adınızın içinde bir çizgi karakteri -varsa, bunun yerine bir alt çubukla başvurmanız gerektiğidir _. Bazı nedenlerden dolayı bunun bir sorun olabileceğinden şüphelendim ve gerçekten benim sorunumdu.

Örneğin. @testable import Ocean-Swiftolur@testable import Ocean_Swift

Başka bir şey, @testablesözdizimini kullanırsanız, üretim kodunuzu test hedefinize eklemediğinizden emin olun. Bunun açıklanamayan tuhaflığa neden olacağını buldum.


1
alfasayısal olmayan tüm karakterlerin alt çizgiyle değiştirilmesi gerekebilir. Benim hedef bu biçimde oldu App (Dev), test edilebilir modül olduApp__Dev_
mushcraft

11

Bu, her iki hedefin oluşturma ayarlarında bir hata gibi görünüyor. Şunlardan emin olmalısınız:

  • ENABLE_TESTABILITY her iki hedef için de Evet'e eşittir.
  • PRODUCT_MODULE_NAMETest hedefinin değer, uygulamanın birinden farklı olması.

2
Bu benim için çalıştı. Yanlış modül adını kullanıyordum. _ Eklemek yerine alanı kaldırıyordum. YAPI AYARLARINDA ÇİFT ÜRÜN MODÜL
ADLARINIZI

9

Kontrol edilmesi gereken bir diğer şey: Eğer bir Objective-C projeniz var, ancak Swift'te birim testleri yazıyorsanız, ana hedefin en az bir Swift dosyası kullandığından emin olun!


Daha fazla bilgi:

Bir Objective-C projesi üzerinde çalışıyordum ama Swift'te birim testleri yazmak istedim.

Gerekli ProjectName-Bridging-Header.h dosyasını oluşturmak için ana hedefe bir Swift dosyası ekledim, testlerimi yazdım ve her şey düzgün çalışıyordu.

Daha sonra Swift dosyasını sildim çünkü ona ihtiyacım olmadığını düşündüm (tüm ana hedefin kodu Objective-C'de ... Sadece Swift'te testler yazıyordum).

Bir "temiz / temiz yapı klasörü" yaptıktan ve "Böyle Modül Yok" sorunu ortaya çıktıktan sonra bir sorun fark etmedim. Bazı kafa çizilmelerinden sonra yeni bir boş Swift dosyası ekledim ve sorun ortadan kalktı.

Swift dosyasıyla / olmadan birden çok kez test ettim ve sadece onunla çalışıyor ... bu yüzden, projede boş dosyayı bırakmam, bazı Objective-C'yi Swift'e dönüştürmem veya bazı eklemem gerekecek Swift'te yazılmış projeye yeni kod.


1
!! 3 saat temizlendikten sonra silme Silinmiş veriler, temizlik, sıfırdan başlayarak 3 kez, sorunumu çözen yorumunuzu buldum! Teşekkürler !!!!
Maryam Fekri

Swift test sınıflarında Objective-C sınıflarına nasıl erişeceğinizi biliyor musunuz, proje modülünü içe aktardığımdan ve bununla ilgili bir hata olmadığından, hala Objective-C sınıflarımı tanımıyor. başka bir şey yapmalı mıyım?
Maryam Fekri

Eklemek istediğim bir başka nokta da, çoğunlukla ObjC projemde en az bir Swift dosyası olsa da, hedefim için köprüleme başlığı yoktu. "Bir Uygulama Hedefi İçerisinde Kodu İçe Aktar" başlığı altındaki aşağıdaki bağlantıdaki talimatları uygulayarak Swift testlerinden ObjC sınıflarına erişme sorunu çözüldü. developer.apple.com/documentation/swift/…
palmi

Bu sorunla karşılaştım. Ancak, mümkünse Swift dosyasını dahil etmekten kaçınmanın bir yolunu bulmakla ilgileniyorum, bu yüzden şu soruyu burada sordum: stackoverflow.com/q/62965954/211292
ThomasW

Aslında, @testable import Foosatırı eklemezseniz, birim testlerinizin doğru bir şekilde çalışması gerekir.
ThomasW

9

Son cevaba kadar ilerleyen ve hala hiçbir şey işe yaramayanlar için, diğer tüm cevap önerilerini takip ettikten sonra benim için ne yaptı. Xcode 11 kullanıyorum:

Benim durumumda soruna neden olan şey, Ürün Adımı değiştirmemdi

  1. Benim değiştirdi Ürün Adı benim ana hedefin Yapı Ayarlarında "Yeni Adı"
  2. Test hedefim için Ana Bilgisayar Uygulamasını yeniden seçmek zorunda kaldım
  3. Ürün adının değiştirilmesinin, test dosyalarıma modül aktarımı için kullanılan Ürün Modülü Adını da değiştireceğini bilmiyordum . İçe aktarma işlemimi şu şekilde değiştirdim:

    @testable içe aktarma Yeni_Ad

  4. İşe yaradı

Umut ediyorum bu yardım eder


7

Bu konularda birkaç gün geçirdikten sonra sonunda projemle çalışmayı başardım. Köprü Başlığı ile ilgili sorun vardı - Ana hedefinizde Köprü Başlığı kullanıyorsanız Testler hedefindeki yol boş olamazKöprüleme Başlığı boş olamaz !!!

Umarım biri için biraz zaman kazanır.


5

Test şemasının oluşturma ayarının altında, test hedefinin listede olduğundan emin olun.

Oynat düğmesinin yanında, test şemasını, ardından Şemayı düzenle ... 'yi seçin, Derleme bölümüne gidin, artı +' yı tıklayın ve test etmek istediğiniz hedefi seçin.

Benim durumumda, geliştirdiğimiz bir iç hedefimiz var (birkaç küçük fark) ve birleştirme işleminden sonra test yapılandırmasından kaldırıldı.

Test düzenini düzenle


5

Burada listelenmemiş olup olmadığını kontrol etmek için başka bir şey daha var. Benim için, belki de Ekibimizin Temsilcisi son Lisans Anlaşmasını henüz kabul etmediği için ekibimle bir ilgisi vardı! Hedefimin Genel ayarlarında farklı bir Ekip seçtikten sonra, 12.1 veya 11.0 gibi belirli bir Dağıtım Hedefi belirledim, aniden "Böyle Bir Modül Yok" uyarısı ortadan kalktı.

resim açıklamasını buraya girin

resim açıklamasını buraya girin


4

Benim durumumda 3 sorun vardı. Birincisi, içeri aktarma yolunu belirtmek zorunda kaldım:

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

İkincisi, Pod'ları kullanıyordum ve bu kapsülleri de testlerime aktarmak zorunda kaldım:

target 'MyAppTests' do
    inherit! :complete
end

Üçüncüsü, hedefimde bir köprü üstbilgisi kullanıyordum, bu yüzden köprü üstbilgisini test için aynı olacak şekilde belirtmek zorunda kaldım.


2

Benim sorunum, test etmek istediğim sınıfın ayrı bir modülde (API İstemcisi) olması gerekiyordu, ancak sınıf aslında çerçeve hedefinin değil, uygulama hedefinin bir üyesiydi. Sınıfın hedef üyeliğini değiştirmek, içe aktarma hatasını ortadan kaldırdı!


2

Ortam: Xcode Sürüm 9.0 (9A235)
Senaryo: Açık kaynaklı bir çerçevenin sınanması .

Aynı sorunu yaşadım: 'Böyle bir modül yok'.

Çözüm:

  1. Test hedefini seçin.
  2. Aşamaları Seç
  3. Link Binary ile test edilecek çerçeveyi ekleyin ...

resim açıklamasını buraya girin

İşte test dosyası: resim açıklamasını buraya girin


2

Aynı sorunu yaşadım. Derleme klasörünü temizleme ve Xcode'u yeniden başlatma işe yaramadı.

Benim için işe yarayan, test hedefinizin ve düzeninizin "Yalnızca Etkin Mimari Oluştur" ayarının, uygulamanızın hedef ve düzeninin ayarıyla eşleşmesini sağlamaktı.


2

Yukarıdaki adımları takip ettim, işe yarayan. Ancak, projemde bazı sorunlar vardı. Bu uyarıyı aldım ve test hedefimi test etmek için ana projemden derslere erişemedim.

Modülün bir bölümünü test eder - içe aktarma yoksayılıyor

Test hedefi Ürün Modülü Adınızın (YourTestTarget -> Derleme Ayarları -> ara product module) proje adınızla aynı adda olamayacağını buldum .

Test hedefi için Ürün Modülü Adı, proje adınızla aynı ad olamaz

Test hedefim için Ürün Modülü Adını değiştirdikten sonra her şey işe yaradı.

resim açıklamasını buraya girin


1

Tüm cevapları burada denedim ama kırmızı bayrak gitmeyecekti. Ama ne olursa olsun boş bir testi "çalıştırarak" işe başladım ve temizlendi.

Emin olmak istiyorum şeyler yapılır:

  • Ana Bilgisayar Uygulaması
  • @testable import "Module_name" (modül adının doğru olduğundan emin olun)
  • Test için dağıtım hedefinin projeyle aynı olduğundan emin olun
  • XCTest'in Hedef üyeliğe sahip olması gerekmez

0

Benim için çözüm, @testable import myproject_ios'u @testable import myproject olarak yeniden adlandırmaktı.


0

Dağıtım Hedefi'ni 9.3'ten 11.0'a değiştirdiğimde bu benim için düzeltildi .

Genel> Dağıtım Hedefi> "11.0"


bu daha çok simülatörlerin değişmesi olabilir ama bu benim için de işe yaradı
RolandasR

0

Benim çözümüm burada.

Öncelikle OdeAlSwiftUITest.swift tıklayın, ardından hedef üyelikte Project TargetName'i kontrol edin.

resim açıklamasını buraya girin


8
Bu yanlış. Test dosyalarınızı asla hedefinize eklemeyin.
smileBot

0

Xcodebuild kullanıyorsanız ve bu sorunu bulursanız, build komutuna bir çalışma alanı bayrağı eklemeyi düşünün.

Bunu Değiştirdi

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

Buna

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

0

Derleme ayarları test hedefinde ana makine testini kontrol edin, PRODUCT_NAME ürününde ayarlanan adı alır. Test sınıflarında kullanmanız gereken isimdir.

PRODUCT_NAME ürününü değiştirmemeyi öneririm (ana hedefin eşleşme adı)


0

resim açıklamasını buraya girin

Proje gezgininde MyAppTests.swift öğesini tıklayın ve sağ paneli tıklayın, hedef Üyelikte modülünüzü kontrol edin. Benimkinde çalışıyor.


Uygulama hedefinize test sınıfları eklememelisiniz.
Alex Motor


-1

Bu cevapta açıklandığı gibi ben sadece Obj-C projesine Swift testleri ekliyordum. Çözüm, sahte bir Swift sınıfı eklemekti, ardından Xcode bir köprü üstbilgisi eklemeyi ve ardından Swift sınıfını kaldırmayı isteyecekti. Bundan sonra her şey iyiydi.


-1

Listelenen diğer şeylere ek olarak, birim test modülü için derleme kaynaklarıma test etmeye çalıştığım sınıf ile dosyayı eklemek zorunda kaldımresim açıklamasını buraya girin


-1

Sanırım bu olmuş olabilir çünkü örnek testleri sildim.

Birim test paketini kaldırdım ve aşağıdaki resimlerde gösterildiği gibi yeniden ekledim ve hepsi tekrar iyiydi.

resim açıklamasını buraya girin

resim açıklamasını buraya girin

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.