Saya mencoba menulis beberapa tes logika iOS terhadap kelas di proyek saya yang menggunakan fungsionalitas dari beberapa perpustakaan di podspec saya. Saya menggunakan bundel tes unit standar yang disediakan dalam Xcode (meskipun bukan Tes Aplikasi, hanya Tes Unit).
Sebagai contoh, saya menggunakan Magical Record, dan saya memiliki perpustakaan yang terhubung di podspec saya. Itu ada di proyek Pods di ruang kerja saya, dan berfungsi seperti yang diharapkan ketika aplikasi berjalan di simulator atau di perangkat. Ketika saya mencoba untuk menautkan ke objek pengujian yang menggunakan Magical Record, saya mendapatkan kesalahan linker yang menyatakan bahwa ia tidak dapat menemukan penyeleksi dari Magical Record. Saya telah mencoba memperbarui HEADER_SEARCH_PATH saya di bundel pengujian logika saya, bahkan sulit mengkodekannya ke direktori header yang dibuat oleh CocoaPods, tetapi tidak berhasil.
Saya bisa menjalankan tes unit terhadap kelas yang tidak menggunakan pustaka CocoaPods tanpa masalah.
Apakah saya salah tentang ini? Haruskah saya melakukan sesuatu yang lain untuk membuat kompiler melihat pustaka CocoaPods?
sumber
isSubclassOfClass:
panggilan kembali keNO
tempat mereka seharusnya kembaliYES
. Satu-satunya alasan saya bisa menjelaskan ini adalah bahwa dependensi benar-benar terhubung dengan target utama dan target pengujian, dan ketika bundel loader target uji memuat bundel utama, ia tidak dapat memutuskan kelas mana yang akan diambil.isKindOfClass:
pengembalianNO
ketika harus kembaliYES
. Jika saya mencatat pointer keClass
objek saya, saya menguji danClass
kelas yang ingin saya bandingkan dengan mereka adalah dua nilai yang berbeda. Jelas kode saya dari bundel aplikasi menggunakan simbol yang berbeda untuk kelas daripada kode dari unit test saya. Adakah yang menemukan cara untuk menyelesaikan ini?Saya menemukan yang ini dengan melihat bagaimana target utama aplikasi saya menerima pengaturan dari perpustakaan CocoaPods. CocoaPods menyertakan file .xcconfig bernama Pods.xcconfig. File ini berisi semua jalur pencarian tajuk.
Jika Anda melihat proyek Anda di navigator proyek dan mengklik tab Info, Anda akan melihat konfigurasi bangunan Anda tercantum di bagian atas. Jika Anda membuka segitiga pengungkapan untuk berbagai konfigurasi Anda, Anda akan melihat Pods tercantum di bawah target utama Anda. Saya harus mengklik drop down dan menambahkan Pods ke target tes logika juga.
Saya juga harus menyalin pengaturan
$(inherited)
dan${PODS_HEADERS_SEARCH_PATHS}
dari target utama saya dan menyalinnya ke target tes logika di bawah Build Settings / HEADER_SEARCH_PATHS.Akhirnya, saya harus menambahkan libPods.a dalam fase membangun Link Binary with Libraries untuk target tes logika saya.
Semoga ini bisa membantu orang lain.
sumber
Ada solusi yang saya temukan di sini Unit Test Dengan CocoaPods :
Buka file proyek dalam Xcode, lalu pilih Project (bukan target), di panel kanan, ada bagian yang disebut Konfigurasi. Pilih Pods di kolom "Based on Configuration file" untuk target pengujian Anda.
sumber
Specta
itu Anda ingin menghubungkan dengan proyek pengujian tetapi tidak dengan proyek utama? : SClass Foo is implemented in both MyApp and MyAppTestCase. One of the two will be used. Which one is undefined.
Ini tampaknya disebabkan oleh bug di Cocoapods; lihat jawaban @JRV di bawah ini.Saya setuju dengan jawaban lain yang mengatakan bahwa perpustakaan perlu dikaitkan dengan target tes. Namun sejauh ini tidak ada saran yang membantu saya. Seperti @fabb menulis dalam komentar: "saat pengujian,
isSubclassOfClass:
panggilan kembali TIDAK di mana mereka harus kembali YA. Satu-satunya alasan saya dapat menjelaskan ini adalah bahwa dependensi benar-benar terhubung dengan target utama dan target pengujian, dan ketika bundel target uji loader memuat bundel utama, tidak dapat memutuskan kelas mana yang akan diambil. " Saya mendapatkan masalah yang sama dengan semua saran sebelumnya di utas ini.Solusi yang saya dapat kerjakan adalah memperbarui Podfile saya untuk menentukan Pods spesifik untuk target utama dan target pengujian saya:
Itu perlu untuk menentukan Pod untuk target pengujian saya meskipun saya tidak menggunakan Pods spesifik pengujian. Kalau tidak, CocoaPods tidak akan memasukkan logika tautan yang diperlukan dalam proyek saya.
Tautan ini yang membantu saya sampai pada kesimpulan ini.
sumber
Saya menambahkan
:exclusive => true
untuk menghindari kesalahan simbol duplikat dalam target pengujian aplikasi.Ketika saya mengubah target tes aplikasi ke unit tes logika satu, kesalahan linker terjadi. Setelah saya hapus
:exclusive => true
, semuanya berfungsi lagi.:exclusive => true
menyatakan bahwa segala sesuatu di luardo...end
TIDAK boleh ditautkanmyProjectTests
, yang masuk akal dalam target pengujian aplikasi, tetapi akan menyebabkan kesalahan linker dalam target pengujian logika.sumber
Anda dapat menggunakan link_with sesuai dengan solusi @Keith Smiley.
Jika Anda memiliki pod umum, dan spesifik untuk setiap target, Anda mungkin ingin menggunakan opsi "def" untuk menentukan grup pod. dan gunakan "def" nanti dalam target eksklusif.
dalam contoh di atas, saya menambahkan 'SSKeychain' ke kedua target, dan 'Typhoon' hanya untuk target 'MyProject'
sumber
Solusi saya untuk masalah ini adalah mengubah Podfile saya untuk memasukkan perpustakaan di kedua target seperti ini
Dan karena saya menggunakan swift saya juga harus mengkonfigurasi target pengujian untuk memasukkan
MyApp-Bridging-Header.h
file. (Di grup Swift Compiler di bawah tab Build Settings)sumber
Pods
proyek Anda . Dengan menyebutkan pod Anda dua kali (satu kali untuk pengujian dan satu lagi untuk aplikasi), Anda akan memiliki dua set target. Ini secara efektif menggandakan pekerjaan konfigurasi yangpod install
harus dilakukan. Ini tidak akan menjadi masalah sampai Anda memiliki> 15 pod, jadi jangan terlalu khawatir sampai saat itu.Saya memiliki kejadian serupa ketika saya kehilangan beberapa file perpustakaan selama beberapa kontrol versi. Saya masih melihat file perpustakaan di Pods saya tetapi dengan kode yang sebenarnya hilang, XCode mengatakan itu hilang. Yang membuatku cemas, menjalankan 'pod install' tidak segera mengembalikan file yang hilang.
Saya harus menghapus dan mengganti pod secara manual dengan melakukan hal berikut:
Ini akan mengembalikan perpustakaan ke bentuk aslinya.
sumber
Perlu juga dicatat bahwa jika Anda telah
libPods.a
menambahkan dua kali, Anda akan mendapatkan beberapa kesalahan buruk seperti ini:Untuk memperbaikinya, hapus saja salah satu
libPods.a
referensi di Project Explorer Anda.sumber
Pada CocoaPods 1.x, ada cara baru untuk mendeklarasikan dependensi bersama antara target dan target tes yang sesuai. Saya telah menggunakan solusi yang diterima oleh Mark Struzinski sampai saat ini, tetapi menggunakan metode ini menghasilkan sejumlah besar peringatan ketika menjalankan tes saya bahwa:
Dengan CocoaPods 1.x kita dapat mendeklarasikan target -Test sebagai warisan melalui jalur pencarian target induk, seperti:
Ini akan menghasilkan target -Tes memiliki akses ke dependensi target aplikasi, tanpa banyak salinan biner. Ini secara serius mempercepat waktu pengujian bagi saya.
sumber
Coba ini berfungsi untuk saya,
Kita perlu mengatur Pods di Configurations,
Project-> Info-> Konfigurasi dalam proyek Xcode (proyek Anda) harus diatur ke proyek utama 'Pods' untuk Debug, Release (dan apa pun yang Anda miliki). Lihat "Header tidak ditemukan - jalur pencarian tidak termasuk"
Semoga ini bisa membantu seseorang.
sumber
Saya bekerja dengan integrasi POD GoogleMaps Objective-C di iOS dengan aplikasi Swift saya dan bagi saya masalahnya adalah bahwa target Pengujian tidak memiliki referensi ke File Header Bridge ( SWIFT_OBJC_BRIDGING_HEADER ) di Pengaturan Bangun. Pastikan aplikasi Anda dan target aplikasi pengujian menunjukkan hal itu sehingga panggilan API pihak ketiga (Maps API, dll.) Dapat digunakan dalam pengujian unit cepat.
sumber
import GoogleMaps
.Sintaks selanjutnya memberikan hasil terbaik bagi saya (diuji dengan cocoapod v.1.2.1):
https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349
Tanpa ini saya memiliki peringatan saat uji coba tentang simbol duplikat.
Setelah peringatan ini hilang.
sumber
Saya punya masalah menggunakan OpenCV di bawah XCTest. Itu memberi saya kesalahan linker
Undefined symbols for architecture arm64
untuk kelas sukacv::Mat
. Saya menginstal OpenCV melalui CocoaPods menggunakan dipod 'OpenCV', '~> 2.0'
bawah target utama. Tidak peduli sekeras apa pun saya mencoba untuk meletakkan ketergantungan OpenCV di bawah target pengujian atauinherit! :search_paths
tidak menggunakannya . Solusinya adalah membuatabstract_target
seperti:Juga berguna adalah
pod deintegrate
&pod clean
perintah yang membantu untuk membersihkan proyek dan memastikan bahwa Anda mulai baru saat pengujian. Anda dapat menginstal keduanya menggunakan[sudo] gem install cocoapods-deintegrate cocoapods-clean
.sumber