'Modul tidak dikompilasi untuk pengujian' saat menggunakan @testable

146

Saya mencoba menggunakan @testabledeklarasi baru Swift 2 untuk mengekspos kelas saya ke target tes. Namun saya mendapatkan kesalahan kompilator ini:

masukkan deskripsi gambar di sini

Intervalsadalah modul yang berisi kelas yang saya coba untuk paparkan. Bagaimana saya menyingkirkan kesalahan ini?

hgbeberapa
sumber

Jawaban:

239

Di target utama Anda, Anda perlu mengatur Enable Testabilityopsi build ke Ya.

Seperti yang dikomentari oleh @earnshavian di bawah ini, ini hanya boleh digunakan pada debug build sesuai catatan rilis apel: "Aktifkan pengaturan build Testability hanya boleh digunakan dalam konfigurasi Debug Anda, karena itu melarang optimasi yang bergantung pada tidak mengekspor simbol internal dari aplikasi atau kerangka kerja " https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

sgaw
sumber
Hai, saya mendapatkan kesalahan yang sama tetapi tidak melihat opsi aktifkan testability dan saya menggunakan xcode 7. Tahu apa yang harus saya lakukan?
user1601259
2
@ user1601259 - Anda dapat menemukan opsi dengan memilih proyek tingkat atas, pergi ke Pengaturan Bangun, dan melihat di bawah judul Bangun Opsi.
hgwhittle
@ hgwhittle - Saat saya memilih proyek tingkat atas, yang saya lihat di opsi build adalah "format informasi debug" dan "validasikan produk build." Ketika saya memilih target dalam opsi membangun saya melihat "konten yang disematkan mengandung kode cepat." Itu dia. Ketika saya mencari di pengaturan build saya tidak dapat menemukannya. Apakah ini karena xcode 7?
user1601259
1
Ada kemungkinan bahwa Anda telah memilih "Dasar" di "Pengaturan Bangun" Anda. Jika Anda memilih "Semua" di sisi kiri, Anda akan melihat "Aktifkan Testabilitas"
Array
1
Bagaimana tepatnya ini bekerja untuk rilis rilis, di mana tes akan berjalan (sangat perlu @testable) tetapi perlu tunduk ke App Store? Jika Enable Testabilityhanya untuk debug build, bagaimana dengan ini? Apakah saya harus mengeluarkan kode pengujian saya untuk rilis?
timgcarlson
15

Dalam kasus saya, saya menggunakan konfigurasi pembuatan kustom untuk pengujian (dipanggil Test) dan juga cocoapodssebagai manajer dependensi

Saya harus menambahkan baris berikut ke ujung saya Podfileuntuk memungkinkan testability

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            if config.name == 'Test'
                config.build_settings['ENABLE_TESTABILITY'] = 'YES'
            end
        end
    end
end

Secara default cocoapodsset ENABLE_TESTABILITYuntuk YEShanya untuk Debugmembangun

Tim
sumber
8

Bagi Anda yang mengalami ini hanya saat menjalankan Xcode Profiler: alihkan konfigurasi build profil dalam manajemen skema Anda ke yang memiliki testabilitas diaktifkan - dan itu akan menjadi debug dalam banyak kasus:

masukkan deskripsi gambar di sini

Wladek Surala
sumber
4

Ini mungkin karena target utama Anda Enable Testabilityditetapkan NO. Anda harus mengaturnya YESdalam skema debug (yang digunakan untuk menjalankan tes Anda).

Jika Anda menggunakan Carthage, masalah ini dapat disebabkan oleh mengimpor kerangka kerja @testable, karena mereka dibuat dengan skema rilis.

Seringkali itu praktik yang buruk untuk mengimpor kerangka kerja dengan awalan itu, sehingga Anda bisa menghindarinya. Jika Anda tidak bisa, Anda harus Enable Testabilitydalam skema rilis kerangka kerja. https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html#//apple_ref/doc/uid/TP40001051-CH1-SW326

Samuel B.
sumber
2
Bagaimana saya bisa menghindari mengimpor kerangka kerja menggunakan @testable? Apa praktik yang baik di sini?
Jonathan Cabrera
3

Saya mulai mendapatkan kesalahan ini ketika menjalankan tes menggunakan Bitrise.

Tidak seperti kata pengguna lain, ini bukan per Targetbasis, atau per Schemabasis, ini per Configurationbasis. Pilih Target-> Build Settingstab -> cari testability-> Aktifkan pada Konfigurasi yang Anda gunakan .

Harap perhatikan bahwa Apple merekomendasikan untuk mengaktifkan ini pada konfigurasi yang Anda gunakan untuk debugging, bukan untuk AppStore.

rgkobashi
sumber
0

Solusi di atas baik-baik saja jika Anda menggunakan pod / Carthage. Tetapi jika Anda menggunakan kerangka kerja dari iOS itu sendiri 'misalnya Kontak', Anda perlu menambahkan jalur ke kerangka kerja ini di 'Jalur Pencarian Perpustakaan' dari target proyek utama Anda. masukkan deskripsi gambar di sini

nikBhosale
sumber
0

Jika Anda mencoba menguji kerangka kerja:

Pergi ke target uji -> Bangun Fase -> Buat fase menyalin file baru -> Pilih kerangka kerja -> Tambahkan semua kerangka kerja yang digunakan secara rekursif

Zaporozhchenko Oleksandr
sumber
0

Jika kebetulan Anda miliki

install! 'cocoapods',
         generate_multiple_pod_projects: true,
         incremental_installation: true

Maka, inilah cara untuk melakukannya.

    # generated_projects only returns results if the we run "pod install --clean-install"
    # or install a pod for the first time

    installer.generated_projects.each do |project|
        project.build_configurations.each do |configuration|
            configuration.build_settings["ENABLE_TESTABILITY"] = "YES" 
        end
    end
Nuno Gonçalves
sumber
-3

Ini tidak terjadi di proyek saya sebelum Xcode 8, tetapi setelah saya upgrade ke Xcode 8, itu membuat saya bingung.

Jawaban yang diposting di sini tidak menyelesaikan masalah saya. Bagi saya, saya hanya membuang tes ini karena tidak diperlukan. Jadi hapus centang tombol tes:

masukkan deskripsi gambar di sini Dan sekarang kesalahan sudah keluar.

Blaszard
sumber
1
Jika Anda tidak membutuhkan pengujian, mungkin lebih baik untuk menghapus target pengujian dari proyek Anda daripada menghapusnya dari semua build.
Jonathan Cabrera