การทดสอบหน่วย Xcode ด้วย Cocoapods


121

ฉันเอาหัวโขกกำแพงด้วยเรื่องนี้ในช่วงสองสามวันที่ผ่านมา แต่แม้จะมีการค้นหา Google / SO / Github หลายครั้งฉันก็ไม่พบวิธีแก้ไขปัญหาที่ฉันมี!

สิ่งที่ฉันพยายามทำคือสร้างการทดสอบหน่วยสำหรับแอปของฉันซึ่งใช้ประโยชน์จากพ็อด Firebase

ฉันใช้ Xcode 7.3.1 และ Cocoapods 1.0.1 อัปเดต:ปัญหายังคงอยู่กับ Xcode 8.0

ด้วย podfile นี้:

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

ในคลาส XCTest ของฉันฉันได้รับ

ไม่มีโมดูลที่จำเป็น "Firebase"

ข้อผิดพลาดที่ @testable import MyApp

อีกทางเลือกหนึ่งกับ podfile นี้:

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

การทดสอบสร้างขึ้น แต่คอนโซลของฉันเต็มไปด้วยคำเตือนเช่น:

คลาส <-FirebaseClassName-> ถูกนำไปใช้ทั้งใน ... MyApp ... และ ... MyAppTests ... หนึ่งในสองจะถูกใช้ อันไหนไม่ได้กำหนด


ฉันใช้เฉพาะ Firebase Analytics หลังจากเปลี่ยนไปใช้การวิเคราะห์ของ Google แล้วทุกอย่างทำงานได้ดี
marosoaie

ฉันยังไม่ได้ลองใช้ตัวเขาเอง แต่ฉันอาจพยายามรวม Firebase ด้วยตนเองโดยไม่ใช้ฝักโกโก้: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
นี่ยังคงเป็นปัญหา
Edward

คำตอบ:


84

ฉันมีปัญหาเดียวกัน ฉันแก้ไขโดยย้ายpod 'Firebase'ไปที่เป้าหมายการทดสอบของฉัน เปลี่ยน Podfile ของคุณเป็นสิ่งนี้:

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

ขอบคุณ แต่ฉันเพิ่งลองทำและยังมีปัญหา "Class ... ถูกนำไปใช้ทั้งใน ... "
doovers

1
มันได้ผลสำหรับฉัน แต่มันก็ยังไม่สมเหตุสมผลสำหรับฉัน นี่ไม่ใช่ครั้งแรกที่ฉันสามารถบอกได้ว่า Firebase กำลังตั้งค่า podspec ของพวกเขาอย่างแปลก ๆ cf twitter.com/dirtyhenry/status/836240557311684608แต่ทีม Firebase ไม่ตอบกลับ :(
Dirty Henry

4
การเปลี่ยนแปลงนี้ไม่ได้ล้างคำเตือนในทันที แต่ได้รับการแก้ไขหลังจากที่ฉันเรียกpod installใช้
blwinters

แก้ปัญหาได้ครึ่งหนึ่ง และอีกครึ่งหนึ่งแก้ไขได้โดยเพิ่ม "$ {PODS_ROOT} / Firebase / Core / Sources" ให้กับเป้าหมายการทดสอบของคุณในการตั้งค่าการสร้าง -> เส้นทางการค้นหาส่วนหัว
ArgaPK

หลังจากที่คุณทำการเปลี่ยนแปลงนี้อย่าลืมเรียกใช้pod installเพื่ออัปเดตการอ้างอิงโครงการ)
jawad

57

ลองเปลี่ยนการสืบทอด:completeเป็นดังใน:

target 'MyAppTests' do
    inherit! :complete
end

ที่สำคัญช่วยให้ทุกคนสามารถตรวจสอบ repo ของคุณได้pod updateตามปกติโดยไม่ต้องคัดลอก.xcconfigไฟล์หรือแฮ็กเกอร์อื่น ๆ เพื่อสร้าง


1
นอกจากนี้ยังมี "Class ... ถูกนำไปใช้ทั้งใน ... "
Diogo T

มันทำให้ข้อผิดพลาดเวลาคอมไพล์หายไป แต่ทำให้เกิดข้อผิดพลาดนี้ที่รันไทม์: clang: error: คำสั่ง linker ล้มเหลวด้วยรหัสออก 1 (ใช้ -v เพื่อดูการเรียกใช้)
CMont

ทำงานให้ฉันเช่นกัน! ขอบคุณ :)
smapps

52
  1. เลือกการตั้งค่าเป้าหมายการทดสอบหน่วยของคุณ
  2. ไปที่การตั้งค่าการสร้าง
  3. มองหาเส้นทางการค้นหาส่วนหัว
  4. เพิ่มค่านี้ $ (SRCROOT) / Pods ด้วยการเรียกซ้ำจากนั้น Xcode จะแก้ไขเส้นทางให้คุณ

ตัวอย่าง


1
ขอบคุณ @Kanika Sharma
Rahul K Rajan

34

ปัญหาคือ Firebase ทำสิ่งพิเศษกับ Header Search Paths หลังจาก CocoaPods สร้างค่าของตัวเองสำหรับการตั้งค่าดังนั้น CocoaPods จึงไม่รับการเปลี่ยนแปลงนี้เพื่อนำไปยังเป้าหมายการทดสอบ คุณสามารถแก้ปัญหานี้ได้สองวิธี:

  1. ค้นหาMyAppTests.<configuration>.xcconfigในตัวนำทางไฟล์และเพิ่มสิ่งต่อไปนี้ในHEADER_SEARCH_PATHS:

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

  2. ค้นหาการตั้งค่าสำหรับHeader Search Pathsใน Build Settings และเพิ่มค่าเดียวกันกับในตัวเลือก 1 ลงในรายการ คุณไม่จำเป็นต้องตั้งค่าเป็นแบบวนซ้ำ

* ตามความคิดเห็นของ AKM สิ่งนี้เปลี่ยนเป็น${PODS_ROOT}/Firebase/Core/Sourcesเวอร์ชัน 3.14.0


พยายามแล้ว แต่ยังคงได้รับคำเตือนเหมือนเดิม
doovers

8
ณ Firebase 3.14.0 โซลูชันนี้ใช้ได้ แต่แพตช์เปลี่ยนเป็น${PODS_ROOT}/Firebase/Core/Sources
AKM

1
เส้นทางใหม่ก็ใช้ได้ผลเช่นกัน! ฉันใช้ CocoaPods เวอร์ชัน 1.2.0แต่โปรดทราบว่าฉันต้องเพิ่มinherit! :search_pathsเป้าหมายการทดสอบในไฟล์Podfile.
Paulo Mattos

2. ไม่ได้ผลสำหรับฉัน การใช้ Firebase 3.x (ไม่ใช่ 4.x ใหม่ล่าสุด)
จอนนี่

ติดตามปัญหาได้ที่นี่: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

สามขั้นตอนก่อนที่ฉันจะสามารถใช้งานได้:

CocoaPods: 1.5.0 Swift 4 Firebase: 4.13.0

ขั้นตอนที่ 1: อย่าลืมเพิ่มบล็อกเป้าหมายต่อไปนี้ใน podfile ของคุณ

# 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

ขั้นตอนที่ 2: ภายในแท็บ YourAppTests Project Navigator Build Settings ค้นหาแถว Header Search Path และเพิ่มใน Debug ในบรรทัดต่อไปนี้

$ (สืบทอดมา) $ {PODS_ROOT} / Firebase / Core / Sources

ขั้นตอนที่ 3: ในการรันเทอร์มินัล:

อัปเดตพ็อด


7

ปัญหาถูกบันทึกไว้ในโครงการ firebase ที่นี่:

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

มีวิธีแก้ปัญหา:

เพิ่ม "$ {PODS_ROOT} / Firebase / Core / Sources" ให้กับเป้าหมายการทดสอบของคุณในการตั้งค่าการสร้าง -> เส้นทางการค้นหาส่วนหัวเท่านั้น

แต่สิ่งนี้ยังได้รับการแก้ไขโดยการอัปเกรดเป็น CocoaPods 1.4.0 หรือใหม่กว่าซึ่งเป็นทางออกที่ดีกว่า

ในขณะที่ฉันกำลังเขียนสิ่งนี้ (พฤศจิกายน 2017) cocoapods 1.4.0 ยังอยู่ในรุ่นเบต้าดังนั้นในการติดตั้งคุณต้องขอเบต้าอย่างชัดเจน:

gem install cocoapods --pre

สิ่งนี้แล้วทำการpod installแก้ไขปัญหาที่เรียกใช้การทดสอบของฉัน


1
"PODS_ROOT" คืออะไร ??
ArgaPK

@ArgaPK เป็นตัวแปรที่ cocoapods กำหนด เพียงวางสิ่งที่ฉันเขียนระหว่าง "" ลงใน Xcode วิธีที่ดีที่สุดคืออัปเกรด CocoaPods ของคุณเป็น> = 1.4.0
JosephH

1
@JosephH การอัปเดต cocoapods ของฉันเป็น 1.5.2 ไม่สามารถแก้ปัญหาได้น่าเสียดาย
Stacy Smith

@AnastasiaKovaleva คุณทำงานpod installหลังจากอัปเกรดหรือไม่?
JosephH

@JosephH Running pod installแก้ปัญหาของฉันได้! ขอบคุณมาก!
Stacy Smith

4

วิธีแก้ปัญหาสำหรับฉันคืออัปเดต cocoapods เป็นเวอร์ชัน 1.1.0.rc.2

sudo gem install cocoapods --pre


น่าเสียดายที่มันไม่ได้ผลสำหรับฉัน ... ฉันต้องคืนคะแนนโหวต!
Zeb

ขออภัยที่ไม่ได้ช่วยพวกคุณไม่แน่ใจว่าทำไมมันถึงแก้ปัญหาให้ฉันไม่ใช่คุณ ...
doovers

ฉันอยู่ที่ 1.20 และไม่มีโชค
UKDataGeek

4

ฉันลองทำตามทั้งหมดข้างต้นและพบข้อผิดพลาดต่างๆเริ่มต้นMissing required module 'Firebase'จากนั้นเริ่มต้นด้วย"Class ... is implemented in both ... "ปัญหาการรับหรือตัวเชื่อมโยงหากฉันพยายามเพิ่ม Firebase Pods ในเป้าหมายการทดสอบของฉัน

วิธีแก้ปัญหาที่ได้ผลสำหรับฉันคือ:

  1. ลบเป้าหมายการทดสอบทั้งหมดออกจาก Podfile และเรียกใช้ 'pod update' เพื่อให้แน่ใจว่าโปรเจ็กต์ XCode ซิงค์กัน
  2. เปิดการตั้งค่า Build ของเป้าหมายทดสอบของฉันและอัปเดตเส้นทางการค้นหาส่วนหัวเพื่อรวมเฉพาะ 3 รายการต่อไปนี้:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

เมื่อถึงจุดนี้การทำความสะอาดโฟลเดอร์ build การสร้างใหม่จากนั้นเรียกใช้การทดสอบอีกครั้งได้ผลสำหรับฉัน หวังว่านี่จะช่วยใครสักคน!


หลังจากลองทำอย่างอื่นในหัวข้อนี้แล้ว - นี่เป็นคำตอบเดียวที่ทำให้ฉันได้ผล ขอบคุณ!
Ali Parr

4

การเพิ่ม${SRCROOT}/Pods/Firebase/CoreOnly/Sources"เส้นทางการค้นหาส่วนหัว" ของเป้าหมายการทดสอบหน่วยช่วยแก้ปัญหา ขั้นตอน:

  1. เลือกเป้าหมายการทดสอบหน่วยของคุณ
  2. ไปที่การตั้งค่าการสร้าง
  3. ค้นหาเส้นทางการค้นหาส่วนหัว
  4. เพิ่ม$ {SRCROOT} / Pods / Firebase / CoreOnly / Sources

ใส่คำอธิบายภาพที่นี่

หลังจากนี้จะทำการทดสอบและข้อผิดพลาดจะหายไป


2

ฉันมีปัญหาที่คล้ายกัน วลีในแง่ของคำถามของคุณฉันคัดลอกเนื้อหาของMyApp.<configuration>.xcconfigไฟล์ไปยังMyAppTests.<configuration>.xcconfigไฟล์ของฉัน ฉันทำความสะอาดและสร้างแบบทดสอบแล้วและมันได้ผล


นี่เป็นทางออกเดียวที่ใช้ได้ผลสำหรับฉัน ขอบคุณ! ฉันกำลังคิดที่จะทำการประมวลผลหลังการติดตั้งใน Podfile โดยทำสิ่งนี้
SauloT

1

เพิ่ม"$ {PODS_ROOT} / Firebase / Core / Sources"ให้กับเป้าหมายการทดสอบของคุณในการ ตั้งค่าการสร้าง -> เส้นทางการค้นหาส่วนหัวเท่านั้น


มันคืออะไร ? PODS_ROOT
ArgaPK

มันจะดึงไดเรกทอรีสำหรับพ็อด
Karthick Vadivel

1

ในฐานะที่เป็น@Willกล่าวถึงปัญหารอบหัวค้นหาเส้นทางหลังจากการติดตั้ง CocoaPods

ผมมีโครงการที่มีเป้าหมายหลายที่ฝัก 'Firebase' MyProject-Sharedฝังลงในโมดูลที่แยกต่างหากช่วยให้พูด Firebase pod ที่ "Podfile" ติดตั้งสำหรับเป้าหมาย "MyProject-Shared" เท่านั้น โมดูลอื่น ๆ ที่ต้องการใช้ 'MyProject-Shared' ไม่สามารถคอมไพล์ได้เนื่องจากมีข้อผิดพลาด:

"ขาดโมดูลที่จำเป็น" Firebase ""

เคล็ดลับในกรณีของฉันคือการเพิ่มเส้นทางการค้นหาส่วนหัวที่ขาดหายไปดังต่อไปนี้ในการตั้งค่าการสร้างของเป้าหมายแต่ละรายการที่อ้างถึงAnalytics-Framework :

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

โปรดดูรูปด้านล่าง: เส้นทางการค้นหาส่วนหัว

หวังว่าจะช่วยประหยัดเวลาของคุณ



0

Missing required module Firebase ไม่มีสารละลาย CocoaPods

สำหรับผู้ที่พบปัญหาเดียวกัน แต่ไม่ได้ใช้ CocoaPods:

หากคุณใช้ Firebase มากกว่าที่คุณมีโฟลเดอร์Firebase.hและmodule.modulemapไฟล์บางโฟลเดอร์ ตัวอย่างเช่น -YOUR_PROJECT_DIR/Linking

หากเป้าหมายโครงการหลักของคุณทำงานได้ถูกต้องกว่าที่คุณควรไปที่ ProjectSettings -> Targets เลือกเป้าหมายการทดสอบ ค้นหาและเพิ่มเส้นทางไปยังUser headers YOUR_PROJECT_DIR/Linkingเลือกrecursiveตัวเลือกและคุณควรจะไป

ดูภาพหน้าจอสำหรับรายละเอียดเพิ่มเติม:

ใส่คำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.