“Tidak ada modul seperti itu” saat menggunakan @testable dalam pengujian Xcode Unit

168

Saya baru-baru ini diperbarui ke Xcode 7 beta 5. Saya mencoba menambahkan unit test ke proyek sebelumnya, tetapi saya mendapatkan pesan kesalahan "Tidak ada modul [myModuleName]" di @testable import myModuleNametelepon.

masukkan deskripsi gambar di sini

Saya mencoba

  • membersihkan proyek dengan OptionClean Build Folder
  • memeriksa bahwa "Aktifkan Testability" (debug) disetel ke Ya di Opsi Bangun
  • menghapus target pengujian dan kemudian menambahkan kembali bundel pengujian Unit iOS

Tak satu pun dari ini bekerja untuk proyek ini (tapi saya mendapatkan pengujian untuk bekerja di proyek lain). Adakah orang lain yang memiliki masalah ini dan menyelesaikannya?

Suragch
sumber
Jika Anda membangun dari baris perintah dengan xcodebuild pastikan untuk menambahkan flag -workspace untuk perintah build Anda. Saya memecahkan masalah ini pada travis build saya seperti itu.
Victor 'Chris' Cabral

Jawaban:

210

Silakan periksa Nama Modul Anda yang ingin Anda impor @testable import "ModuleName". Nama modul harus sama padaTarget->Build Settings-> Product Module Name

Voda Ion
sumber
5
Sebagian besar kasus, ini tentang nama modul produk. Periksa spacedan_
onmyway133
5
hati-hati tentang -dan _. Salah satu proyek saya memiliki minus -dalam namanya, tetapi modulnya memiliki garis bawah _sebagai gantinya
berilium
4
saya menggunakan ""ide itu, dan mendapatkanExpected identifier in import declaration
abbood
1
@ onmyway133 sangat dekat. Dalam kasus saya, saya memiliki nama modul produk yang berbeda dari nama proyek saya. Untuk menemukan nama modul Anda, Build Settingspilih proyek Anda (bukan tes atau tes UI) kemudian cari PRODUCT_MODULE_NAMEapa pun yang muncul ada yang harus @testable import
dicari
115

Jawaban yang berhasil bagi saya

Jawabannya adalah saya memiliki beberapa kesalahan dalam proyek yang membuat pembangunan gagal. (Itu hanya bug standar Anda setiap hari dalam kode.) Setelah saya memperbaiki kesalahan dan melakukan pembersihan dan pembangunan lainnya, itu berhasil.

Perhatikan bahwa kesalahan ini tidak muncul pada awalnya. Agar mereka muncul:

  • Komentari seluruh file Uji yang memberi Anda kesalahan "Tidak modul seperti itu".
  • Coba jalankan proyek Anda lagi.

Jika ada kesalahan lain, itu harus muncul sekarang. Perbaiki dan kemudian batalkan komentar kode file Uji Anda. Kesalahan "Tidak ada modul seperti itu" hilang untuk saya.


Jika ini tidak menyelesaikan masalah bagi orang lain, Anda juga dapat mencoba yang berikut:

Bersihkan folder build

Buka menu Produk, tahan Option, dan klik "Clean Build Folder ..."

masukkan deskripsi gambar di sini

Pastikan Aktifkan Testability diatur ke Ya

Di Project Navigator klik nama proyek Anda. Pilih Pengaturan Bangun dan gulir ke bawah ke Opsi Bangun. Pastikan Aktifkan Testability adalah Ya (untuk debug).

masukkan deskripsi gambar di sini

Hapus dan tambahkan kembali target Tes Anda

Jika Anda telah melakukan hal-hal lain, tebakan saya adalah bahwa Anda mungkin tidak perlu melakukan ini. Tetapi jika Anda melakukannya, ingatlah untuk menyimpan Tes Unit apa pun yang telah Anda tulis.

Klik nama proyek Anda di Navigator Proyek. Kemudian pilih target Tes Anda. Klik tombol minus (-) di bagian bawah untuk menghapusnya.

masukkan deskripsi gambar di sini

Kemudian klik tombol tambah (+) dan pilih Bundel Pengujian Unit iOS untuk menambahkannya kembali. Seperti yang Anda lihat, Anda juga bisa menambahkan Bundel Pengujian UI dengan cara yang sama.

Beberapa ide lain

  • Pastikan bahwa semua kelas yang diperlukan adalah anggota target tes Anda.
  • Pastikan Anda telah menambahkan semua perpustakaan yang diperlukan.
  • Pastikan nama modul ditulis dengan benar (lihat jawaban ini ).

Atau...

Tinggalkan komentar atau jawaban di bawah ini jika Anda menemukan sesuatu yang berhasil.

Terkait

Suragch
sumber
2
Memiliki semua masalah yang sama di sini, dengan Xcode 7 beta 5. Sayangnya langkah-langkah di atas tampaknya tidak menyelesaikannya - modul masih menganggap sebagai, "tidak ada modul seperti 'Utilitas'." Satu-satunya perbedaan dari tangkapan layar Anda adalah bahwa saya mencoba membuatnya berfungsi dengan folder tes UI (GlimpulseitITests dalam kasus saya). Apakah @testable tidak berfungsi dengan target pengujian UI mungkin?
Zac
5
*** PENTING *** Jika Anda menghapus dan menambahkan kembali Target Tes Anda, itu akan membuat ulang template tes kosong menimpa tes yang ada. Pastikan untuk menyimpan sumber pengujian Anda sebelum melakukan ini.
pauln
2
Bagi saya bahkan kelas individual saya tidak ditampilkan saat mengetik ... Saya akhirnya melakukan Product> Clean, restart XCode. Ketika restart, berikan beberapa detik untuk menyelesaikan pengindeksan dan kemudian voila semua referensi saya muncul tanpa harus memasukkan setiap kelas sebagai anggota target uji.
Rajive Jain
1
Juga jika Anda belum mencoba ini, klik kerangka kerja Anda yang hilang di sebelah kiri, lalu di sebelah kanan pilih "Target Keanggotaan" dan sertakan dalam target uji unit Anda.
albogdano
3
Buka untuk membuat pengaturan target utama Anda -> "Nama Modul Produk" dan lihat apakah itu cocok dengan nama modul yang Anda coba impor dalam pengujian Anda.
f0rz
64

Masalahnya bagi saya adalah target penyebaran iOS dari tes tidak ditetapkan untuk menjadi sama dengan target utama. Jadi pastikan untuk memeriksa ini.

Di target pengujian Anda:

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>
Jess
sumber
Setelah melakukan itu, aku harus mengatur Enable Bitcodeuntuk Nodi Uji Bundle.
pableiros
2
Lol itu berfungsi tetapi betapa bodohnya dari xcode bahwa ia tidak melakukan kesalahan yang berbeda
J. Doe
31

Jadi ini adalah bagaimana saya mulai mendapatkan kode saya untuk bekerja setelah mencoba semua solusi yang disarankan dari saran sebelumnya.

  • Saya menetapkan 'Aktifkan testabilitas' ke 'YA' di Pengaturan Bangun proyek
  • Saya juga mengatur 'Defines Module' ke 'YES' di Build Settings proyek saya.
  • Untuk file .swift biasa dalam proyek saya, katakan MyApp , saya akan menulis kasus uji untuk, saya memiliki baik target " MyApp " dan " MyAppUnitTests " diperiksa di bawah Target Keanggotaan .
  • Saya kemudian memilih file unit test saya, menyatakan ' @testable import MyApp ' di bagian atas, di bawah ' import XCTest ', dan hanya memeriksa "MyAppUnitTests" di bawah Target keanggotaan

Dan semuanya bekerja seperti pesona. Semoga ini membantu.

Vick Swift
sumber
8
Mengaktifkan Modul testability and Defines adalah triknya. Saya tidak perlu mengubah keanggotaan target untuk file * .swift biasa.
George Yacoub
Saya melakukan semua langkah di atas tetapi saya masih tidak memiliki kesalahan modul seperti itu. proyek saya adalah campuran cepat
Mikael
@Mikael, apakah Anda hanya menulis tes untuk file Swift di basis kode Objc / Swift Anda? (Saya bertanya karena, terakhir kali saya memeriksa, saya pikir '@testable import' hanya berfungsi untuk menulis kasus pengujian hanya untuk file Swift bahkan dalam campuran kode basis Obj-c / Swift. Mungkin mungkin sudah berubah sekarang. Seseorang benar saya jika saya salah di sini).
Vick Swift
6
Saya menemukan masalah saya. Itu karena Arsitektur Valid dari target Tes saya tidak sama dengan konfigurasi Arsitektur Valid target utama saya. Sekarang berhasil. Btw, saya sedang menguji hanya kelas Swift dalam kasus saya, saya tidak mencobanya untuk Obj-c
Mikael
3
Anda seharusnya tidak menambahkan file aplikasi cepat ke target pengujian Anda, itu akan membuat konten mereka digandakan ketika menjalankan tes.
Przemysław Wrzesiński
18

Satu hal yang perlu diperhatikan adalah jika nama modul Anda memiliki karakter tanda hubung di dalamnya, -maka Anda harus merujuknya dengan underbar sebagai gantinya _. Untuk beberapa alasan saya curiga ini mungkin masalah dan itu memang masalah saya.

misalnya. @testable import Ocean-Swiftmenjadi@testable import Ocean_Swift

Hanya satu hal lagi, jika Anda menggunakan @testablesintaksis pastikan untuk tidak memasukkan kode produksi Anda dalam target pengujian Anda. Saya menemukan ini akan menyebabkan keanehan yang tidak dapat dijelaskan.

smileBot
sumber
1
semua karakter non-alfanumerik mungkin juga perlu diganti dengan garis bawah. Target saya adalah dalam format ini App (Dev), Modul yang dapat diuji menjadiApp__Dev_
kerajinan
11

Ini terdengar sebagai kesalahan dengan pengaturan build dari kedua target. Anda perlu memastikan bahwa:

  • ENABLE_TESTABILITY sama dengan Ya untuk kedua target.
  • The PRODUCT_MODULE_NAMEnilai target uji harus berbeda dari salah satu aplikasi.
Yageek
sumber
2
Ini berhasil untuk saya. Saya menggunakan nama modul yang salah. Saya menghapus spasi alih-alih menambahkan _.
GANDAKAN PERIKSA
9

Satu hal lagi yang perlu diperiksa: Jika Anda memiliki proyek Objective-C, tetapi sedang menulis unit test di Swift, pastikan target utama menggunakan setidaknya satu file Swift!


Info lebih lanjut:

Saya sedang mengerjakan proyek Objective-C, tetapi ingin menulis unit test di Swift.

Saya menambahkan file Swift ke target utama untuk menghasilkan file ProjectName-Bridging-Header.h yang diperlukan, menulis tes saya dan semuanya bekerja dengan baik.

Kemudian saya menghapus file Swift karena saya pikir saya tidak membutuhkannya (semua kode target utama ada di Objective-C ... Saya hanya menulis tes di Swift).

Saya tidak melihat masalah sampai nanti, setelah saya melakukan "folder build bersih / bersih" dan masalah "No Such Module" muncul. Setelah beberapa goresan kepala saya menambahkan file Swift kosong baru dan masalahnya hilang.

Saya telah mengujinya berkali-kali dengan / tanpa file Swift, dan hanya berfungsi dengan itu ... jadi, saya akan perlu meninggalkan file kosong dalam proyek, mengubah beberapa Objective-C menjadi Swift, atau menambahkan beberapa kode baru untuk proyek yang ditulis dalam Swift.

Jim Rhoades
sumber
1
!! setelah 3 jam membersihkan menghapus data Drieved, membersihkan, mulai dari awal 3 kali, saya menemukan komentar Anda yang menyelesaikan masalah saya !!! Terima kasih !!!!
Maryam Fekri
Apakah Anda tahu cara mengakses kelas Objective-C di kelas tes Swift, karena saya mengimpor modul proyek dan tidak ada kesalahan dengan itu, tetapi masih tidak mengenali kelas Objective-C saya. haruskah saya melakukan hal lain?
Maryam Fekri
Satu poin tambahan yang ingin saya tambahkan, meskipun proyek saya yang kebanyakan ObjC memiliki setidaknya satu file Swift, tidak ada header penghubung untuk target saya. Mengikuti instruksi pada tautan berikut di bawah judul "Impor Kode Dalam Sasaran Aplikasi" yang dipecahkan untuk dapat mengakses kelas ObjC dari tes Swift. developer.apple.com/documentation/swift/…
palmi
Saya mengalami masalah ini. Namun, saya tertarik untuk menemukan cara untuk menghindari memasukkan file Swift jika memungkinkan, jadi saya mengajukan pertanyaan di sini: stackoverflow.com/q/62965954/211292
ThomasW
Sebenarnya, jika Anda tidak memasukkan @testable import Foogaris, tes unit Anda harus berjalan dengan benar.
ThomasW
9

Bagi mereka yang telah menggulir hingga jawaban terakhir dan masih belum ada yang berhasil, berikut adalah apa yang dilakukan untuk saya setelah mengikuti semua saran jawaban lainnya. Saya menggunakan Xcode 11:

Apa yang menyebabkan masalah dalam kasus saya adalah saya mengubah Nama Produk saya

  1. Saya mengubah Nama Produk saya di Pengaturan Bangun target utama saya menjadi "Nama Baru"
  2. Saya harus memilih kembali Aplikasi Host untuk target pengujian saya
  3. Saya tidak tahu bahwa mengubah nama produk juga akan mengubah Nama Modul Produk , yaitu yang digunakan untuk impor modul dalam file pengujian saya. Saya mengubah impor saya sebagai berikut:

    @testable impor New_Name

  4. Itu berhasil

Saya harap ini membantu

SwissMark
sumber
7

Setelah menghabiskan beberapa hari pada masalah ini akhirnya saya membuatnya bekerja dengan proyek saya. Masalahnya ada di Bridging Header - jalur di target Tes tidak boleh kosong jika Anda menggunakan Bridging Header di target utama AndaBridging Header tidak boleh kosong !!!

Semoga ini akan menghemat waktu bagi seseorang.

Igor P
sumber
5

Pastikan di bawah pengaturan build skema pengujian, target pengujian ada dalam daftar.

Di samping tombol putar, pilih skema pengujian, lalu Edit skema ..., buka bagian Build, klik plus + dan pilih target yang ingin Anda uji.

Dalam kasus saya, kami memiliki target internal yang kami kembangkan (beberapa perbedaan kecil) dan setelah bergabung, itu dihapus dari konfigurasi uji.

Edit skema pengujian

BrianHenryIE
sumber
5

Berikut ini adalah hal lain untuk memeriksa yang tidak terdaftar. Bagi saya, itu ada hubungannya dengan tim saya, mungkin karena Agen Tim kami belum menyetujui Perjanjian Lisensi terbaru! Setelah saya memilih Tim yang berbeda di pengaturan Umum Target saya, DAN kemudian saya menentukan Target Penempatan spesifik seperti 12.1 atau 11.0, tiba-tiba peringatan "No Such Module" hilang.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Dave Levy
sumber
4

Dalam kasus saya, saya memiliki 3 masalah. Yang pertama adalah saya harus menentukan jalur impor di:

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

Yang kedua adalah saya menggunakan Pod dan saya harus mengimpor pod ini ke pengujian saya juga menggunakan:

target 'MyAppTests' do
    inherit! :complete
end

Yang ketiga karena saya menggunakan header bridging di target saya, jadi saya harus menentukan header bridging yang sama untuk tes.

el3ankaboot
sumber
2

Masalah saya adalah bahwa kelas yang ingin saya uji seharusnya berada dalam modul terpisah (API Client), tetapi kelas itu sebenarnya adalah anggota target aplikasi dan bukan target kerangka kerja. Mengubah target keanggotaan kelas membuat kesalahan impor hilang!

Maciej Swic
sumber
2

Lingkungan: Xcode Versi 9.0 (9A235)
Skenario: Menguji kerangka kerja sumber terbuka.

Saya memiliki masalah yang sama: 'Tidak ada modul seperti itu'.

Larutan:

  1. Pilih target Tes.
  2. Pilih Build Phases
  3. Tambahkan kerangka kerja yang akan diuji melalui Link Biner ...

masukkan deskripsi gambar di sini

Inilah file tesnya: masukkan deskripsi gambar di sini

Frederick C. Lee
sumber
2

Saya punya masalah yang sama. Membersihkan folder build dan memulai ulang Xcode tidak berhasil.

Apa yang berhasil bagi saya adalah memastikan bahwa pengaturan untuk "Hanya Membangun Arsitektur Aktif" dari target dan skema pengujian Anda cocok dengan pengaturan target dan skema aplikasi Anda.

palmi
sumber
2

Saya mengikuti langkah-langkah di atas, yang berhasil. Namun, proyek saya memiliki beberapa masalah lagi. Saya mendapat peringatan ini dan saya tidak bisa mengakses kelas dari proyek utama saya untuk menguji target pengujian saya.

Menguji bagian dari modul - mengabaikan impor

Saya menemukan bahwa target Tes Anda Nama Modul Produk (YourTestTarget -> Pengaturan Bangun -> pencarian product module) tidak boleh sama dengan nama proyek Anda.

Nama Modul Produk untuk target pengujian tidak boleh sama dengan nama proyek Anda

Setelah saya mengubah Nama Modul Produk untuk target pengujian saya semuanya bekerja.

masukkan deskripsi gambar di sini

Bryan Norden
sumber
1

Solusi saya ada di sini.

Pertama, klik OdeAlSwiftUITest.swift, lalu periksa Project TargetName dalam keanggotaan target.

masukkan deskripsi gambar di sini

eyup
sumber
7
Ini salah. Jangan pernah menambahkan file pengujian Anda ke target Anda.
smileBot
1

masukkan deskripsi gambar di sini

Klik MyAppTests.swift di navigator proyek, dan klik panel kanan, periksa modul Anda di Keanggotaan target. Itu bekerja di tambang.

Firda Sahidi
sumber
1

Saya mencoba semua jawaban di sini tetapi bendera merah tidak mau hilang. Tetapi saya berhasil dengan hanya "menjalankan" tes kosong terlepas dan itu beres.

Hal-hal yang saya ingin pastikan sudah selesai:

  • Aplikasi Host
  • @testable import "Module_name" (pastikan nama modulnya benar)
  • Pastikan target penempatan Anda untuk tes ini sama dengan proyek
  • XCTest tidak perlu memiliki keanggotaan Target
Alexander
sumber
0

Bagi saya solusinya adalah mengubah nama @testable import myproject_ios menjadi @testable import myproject setelah saya memperbarui nama produk target myproject-ios di Build Settings / Packaging / Nama Produk / dari $ {TARGET_NAME} menjadi myproject.

Matthias
sumber
0

Ini diperbaiki untuk saya ketika saya mengubah Target Penempatan dari 9.3 menjadi 11.0.

Umum> Target Penerapan> "11.0"

jacob_g
sumber
ini mungkin lebih merupakan kasus penggantian simulator tetapi ini juga berhasil bagi saya
RolandasR
0

Jika Anda menggunakan xcodebuild dan menemukan masalah ini, pertimbangkan untuk menambahkan flag workspace ke perintah build.

Mengubah ini

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

Untuk ini

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test
Victor 'Chris' Cabral
sumber
0

Dalam membangun target pengujian pengaturan, periksa pengujian host, diperlukan nama yang ditetapkan di PRODUCT_NAME. Itu adalah nama yang harus Anda gunakan di kelas tes.

Saya merekomendasikan untuk tidak mengubah PRODUCT_NAME (nama yang cocok dengan target utama)

Sam
sumber
-1

Seperti yang dijelaskan dalam jawaban ini saya menambahkan tes Swift ke proyek Obj-C saja. Solusinya adalah menambahkan kelas Swift dummy, setelah itu Xcode akan meminta untuk menambahkan header bridging, kemudian menghapus kelas Swift. Semua baik-baik saja setelah itu.

funkybro
sumber
-1

Saya menambahkan hal-hal lain yang terdaftar, saya harus menambahkan file dengan kelas yang saya coba uji ke sumber kompilasi saya untuk modul unit testmasukkan deskripsi gambar di sini

Matt D
sumber
-1

Saya pikir ini mungkin terjadi karena saya menghapus contoh tes.

Saya menghapus bundel tes Unit kemudian menambahkannya kembali seperti yang ditunjukkan pada gambar di bawah dan semuanya baik-baik saja.

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Declan McKenna
sumber