Pengujian Unit Xcode dengan Cocoapods

119

Saya telah membenturkan kepala saya ke dinding dengan ini selama beberapa hari terakhir tetapi meskipun banyak pencarian Google / SO / Github, saya tidak dapat menemukan resolusi untuk masalah yang saya alami!

Yang saya coba lakukan adalah membuat beberapa pengujian unit untuk aplikasi saya yang menggunakan pod Firebase.

Saya menggunakan Xcode 7.3.1 & Cocoapods 1.0.1. Pembaruan: Masalah tetap dengan Xcode 8.0

Dengan podfile ini:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
    end
end

Di kelas XCTest saya, saya dapatkan

Modul 'Firebase' yang diperlukan tidak ada

kesalahan di @testable import MyApp

Alternatifnya dengan podfile ini:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

def common_pods
    pod 'SwiftyTimer'
    pod 'Firebase'
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'
end

target 'MyApp' do
    common_pods
end

target 'MyAppTests' do
    common_pods
end

Tes dibangun tetapi konsol saya dipenuhi dengan peringatan misalnya:

Kelas <-FirebaseClassName-> diimplementasikan di ... MyApp ... dan ... MyAppTests ... Salah satu dari keduanya akan digunakan. Mana yang belum ditentukan

doovers
sumber
Saya hanya menggunakan Firebase Analytics. Setelah Pindah ke Google analytics semuanya bekerja seperti pesona.
marosoaie
Saya belum mencoba sendiri, tetapi saya mungkin mencoba memasukkan Firebase secara manual tidak menggunakan biji kakao: firebase.google.com/docs/ios/setup#frameworks
Jonny
1
Ini masih menjadi masalah
Edward

Jawaban:

84

Saya memiliki masalah yang sama. Saya menyelesaikannya dengan pindah pod 'Firebase'ke target pengujian saya. Ubah Podfile Anda menjadi ini:

platform :ios, '9.0'
use_frameworks!
inhibit_all_warnings!

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target 'MyAppTests' do
        inherit! :search_paths
        pod 'Firebase'
    end
end
Mackarous
sumber
Terima kasih, tetapi saya baru saja mencobanya dan saya masih memiliki masalah "Kelas ... diterapkan di keduanya ...".
doovers
1
Itu berhasil untuk saya tetapi masih tidak masuk akal bagi saya. Ini bukan pertama kalinya saya tahu bahwa Firebase menyiapkan podspec mereka dengan aneh, lih. twitter.com/dirtyhenry/status/836240557311684608 tetapi tim Firebase tidak membalas :(
Dirty Henry
4
Membuat perubahan ini tidak segera menghapus peringatan, tetapi diselesaikan setelah saya berlari pod install.
blwinters
Setengah masalah terpecahkan. dan separuh lainnya diselesaikan dengan Tambahkan "$ {PODS_ROOT} / Firebase / Core / Sources" ke target Tes Anda hanya di bawah Build Settings -> Header Search Paths
ArgaPK
Setelah Anda membuat perubahan ini, jangan lupa untuk menjalankannya pod installuntuk memperbarui dependensi proyek;)
jawad
57

Coba ubah warisan menjadi :complete, seperti dalam:

target 'MyAppTests' do
    inherit! :complete
end

Yang penting, ini memungkinkan orang lain memeriksa repo Anda untuk hanya melakukan pod updateseperti biasa tanpa harus menyalin .xcconfigfile atau peretasan lain hanya untuk membangun.

Andy Chou
sumber
1
Ini juga memiliki masalah "Kelas ... diterapkan di kedua ..."
Diogo T
Itu membuat kesalahan waktu kompilasi menghilang, tetapi menyebabkan kesalahan ini pada saat runtime: clang: error: perintah linker gagal dengan kode keluar 1 (gunakan -v untuk melihat permintaan)
CMont
Bekerja untuk saya juga! Terima kasih :)
smapps
52
  1. Pilih setelan Target Uji Unit Anda.
  2. Buka Pengaturan Bangun.
  3. Cari Jalur Pencarian Header.
  4. Tambahkan nilai ini $ (SRCROOT) / Pods dengan rekursif, maka Xcode akan menyelesaikan jalur untuk Anda.

Contoh

Kanika Sharma
sumber
1
Terima kasih @Kanika Sharma
Rahul K Rajan
34

Masalahnya adalah Firebase melakukan sesuatu yang khusus dengan Jalur Pencarian Header setelah CocoaPods menghasilkan nilainya sendiri untuk setelan tersebut sehingga CocoaPods tidak mengambil perubahan ini untuk membawanya ke target pengujian. Anda dapat menyelesaikan ini dengan salah satu dari dua cara:

  1. Temukan MyAppTests.<configuration>.xcconfigdi navigator file dan tambahkan yang berikut ini ke HEADER_SEARCH_PATHS:

    ${PODS_ROOT}/Firebase/Analytics/Sources [*]

  2. Temukan pengaturan untuk Jalur Pencarian Header di Pengaturan Bangun dan tambahkan nilai yang sama seperti pada opsi 1 ke daftar. Anda tidak perlu menyetelnya sebagai rekursif.

* Sesuai komentar AKM, ini berubah menjadi ${PODS_ROOT}/Firebase/Core/Sourcesdi versi 3.14.0

Akan
sumber
Mencoba itu tetapi masih mendapatkan peringatan yang sama
doovers
8
Pada Firebase 3.14.0, solusi ini valid, namun patch diubah menjadi${PODS_ROOT}/Firebase/Core/Sources
AKM
1
Jalan baru juga berhasil untuk saya! Saya menjalankan CocoaPods versi 1.2.0 , tetapi perlu diingat bahwa saya juga harus menambahkan inherit! :search_pathstarget pengujian di Podfile.
Paulo Mattos
2. tidak bekerja untuk saya. Menggunakan Firebase 3.x (bukan yang terbaru 4.x)
Jonny
Masalah dapat diikuti di sini: github.com/firebase/firebase-ios-sdk/issues/58
CMont
7

Tiga Langkah sebelum saya bisa membuatnya bekerja:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

Langkah 1: Pastikan untuk menambahkan blok target berikut ke dalam podfile Anda.

# Uncomment the next line to define a global platform for your project
platform :ios, '11.3'

target 'TIMII' do
# Comment the next line if you're not using Swift and don't want to use dynamic frameworks
use_frameworks!

# Pods for TIMII
pod 'Firebase/Core'
pod 'Firebase/Database'
pod 'Firebase/Auth'
pod 'Firebase/Storage'

    target 'TIMIITests' do
        inherit! :search_paths
        pod 'Firebase/Core'
    end

end

Langkah 2: Di dalam tab Pengaturan Build YourAppTests Project Navigator. Temukan baris Header Search Path dan tambahkan ke Debug baris berikut

$ (diwariskan) $ {PODS_ROOT} / Firebase / Core / Sources

Langkah 3: Dalam menjalankan terminal:

pembaruan pod

Sid
sumber
7

Masalahnya dicatat dalam proyek firebase di sini:

https://github.com/firebase/firebase-ios-sdk/issues/58

Ada solusinya:

Tambahkan "$ {PODS_ROOT} / Firebase / Core / Sources" ke target Tes Anda hanya pada Build Settings -> Header Search Paths

tetapi ini juga diperbaiki dengan meningkatkan ke CocoaPods 1.4.0 atau yang lebih baru, yang merupakan solusi yang lebih baik.

Saat saya menulis ini (November 2017) cocoapods 1.4.0 masih dalam versi beta, jadi untuk menginstalnya Anda perlu secara eksplisit meminta versi beta:

gem install cocoapods --pre

Ini dan kemudian melakukan pod installmemecahkan masalah menjalankan tes saya.

JosephH
sumber
1
apa itu "PODS_ROOT" ??
ArgaPK
@ArgaPK Ini adalah variabel yang disetel cocoapods. Cukup tempelkan persis seperti yang saya tulis di antara "" ke Xcode. Benar-benar cara terbaik adalah dengan meningkatkan CocoaPods Anda ke> = 1.4.0.
JosephH
1
@JosephH memperbarui cocoapods saya ke 1.5.2 tidak menyelesaikan masalah, sayangnya.
Stacy Smith
@AnastasiaKovaleva apakah Anda menjalankan pod installsetelah meningkatkan?
JosephH
@JosephH Running pod installmemecahkan masalah saya! Terima kasih banyak!
Stacy Smith
4

Solusi bagi saya adalah memperbarui cocoapods ke versi 1.1.0.rc.2.

sudo gem install cocoapods --pre

doovers
sumber
Sayangnya itu tidak berhasil untuk saya ... Saya harus mengambil kembali suara positif saya!
Zeb
Maaf itu tidak membantu Anda, tidak yakin mengapa itu menyelesaikan masalah untuk saya dan bukan Anda ...
doovers
Saya berada di 1.20 dan tidak berhasil
UKDataGeek
4

Saya mencoba semua hal di atas dan mengalami berbagai error yang berbeda, awalnya dimulai dengan Missing required module 'Firebase', kemudian mendapatkan "Class ... is implemented in both ... "atau masalah linker jika saya mencoba menambahkan Firebase Pod ke target pengujian saya.

Solusi yang berhasil bagi saya adalah:

  1. Hapus seluruh target pengujian dari Podfile dan jalankan 'pod update' untuk memastikan project XCode sinkron.
  2. Buka Pengaturan Build target pengujian saya dan perbarui jalur pencarian header untuk hanya menyertakan 3 item berikut:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

Pada titik ini, membersihkan folder build, membangun kembali, lalu menjalankan ulang pengujian berhasil untuk saya. Semoga ini bisa membantu seseorang!

Mike Atkins-Spelling
sumber
Setelah mencoba semua yang lain di utas ini - ini adalah satu-satunya jawaban yang membuat semuanya berhasil untuk saya. Terima kasih!
Ali Parr
4

Menambahkan ${SRCROOT}/Pods/Firebase/CoreOnly/Sourceske dalam "Jalur pencarian header" target pengujian unit memperbaiki masalah. Langkah:

  1. Pilih target pengujian unit Anda
  2. Buka Pengaturan Bangun
  3. Cari jalur pencarian header
  4. Tambahkan $ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

masukkan deskripsi gambar di sini

Setelah ini tes dapat berjalan dan kesalahan akan hilang.

Pengguna123335511231
sumber
2

Saya memiliki masalah serupa. Berdasarkan pertanyaan Anda, saya menyalin konten MyApp.<configuration>.xcconfigfile saya ke MyAppTests.<configuration>.xcconfigfile saya . Saya membersihkan dan membuat tes, dan itu berhasil.

Jason
sumber
Ini adalah satu-satunya solusi yang berhasil untuk saya. Terima kasih! Saya sedang berpikir untuk melakukan pemrosesan pasca instalasi di Podfile melakukan ini
SauloT
1

Tambahkan "$ {PODS_ROOT} / Firebase / Core / Sources" ke target Tes Anda hanya di Build Settings -> Header Search Paths

Karthick Vadivel
sumber
Apa itu ? PODS_ROOT
ArgaPK
itu akan mengambil direktori untuk pod
Karthick Vadivel
1

Seperti @Will menyebutkan masalah seputar Jalur Pencarian Header setelah penginstalan CocoaPods.

Saya memiliki proyek dengan beberapa target di mana pod 'Firebase' disematkan ke modul terpisah, katakanlah MyProject-Shared . Pod Firebase di 'Podfile' hanya dipasang untuk target 'MyProject-Shared'. Modul lain, yang ingin menggunakan 'MyProject-Shared' tidak dapat dikompilasi karena kesalahan:

'modul yang diperlukan "Firebase"' tidak ada

Trik dalam kasus saya adalah menambahkan jalur pencarian tajuk yang hilang berikut ini di setiap Pengaturan Build target yang merujuk ke Kerangka-Analisis :

"${PODS_ROOT}/Firebase/CoreOnly/Sources"

Silakan lihat gambar di bawah ini: Jalur Pencarian Header

Semoga ini akan menghemat waktu Anda.

Stanislau Baranouski
sumber
1

Metode sederhana yang juga berfungsi:

target 'MyApp' do
    pod 'Firebase/Auth'
    pod 'Firebase/Database'
    pod 'Firebase/Storage'

    target :MyAppTests
end
Daniel
sumber
0

Missing required module Firebase TIDAK ADA solusi CocoaPods

Bagi mereka yang mengalami masalah yang sama tetapi TIDAK menggunakan CocoaPods:

Jika Anda menggunakan Firebase, maka Anda memiliki beberapa folder yang berisi Firebase.hdan module.modulemapfile. Sebagai contoh -YOUR_PROJECT_DIR/Linking

Jika target proyek utama Anda bekerja dengan benar, maka Anda harus pergi ke ProjectSettings -> T Target. Pilih target pengujian. Cari User headersdan tambahkan jalur ke YOUR_PROJECT_DIR/Linking. Pilih recursiveopsi dan Anda sebaiknya pergi.

Lihat tangkapan layar untuk lebih jelasnya:

masukkan deskripsi gambar di sini

beberapa baris kode
sumber