Kiểm tra đơn vị Xcode với Cocoapods


119

Tôi đã đập đầu vào tường với điều này trong vài ngày qua nhưng mặc dù có nhiều tìm kiếm Google / SO / Github, tôi không thể tìm ra giải pháp cho các vấn đề tôi gặp phải!

Tất cả những gì tôi đang cố gắng là tạo một số thử nghiệm đơn vị cho ứng dụng của mình, sử dụng các nhóm Firebase.

Tôi đang sử dụng Xcode 7.3.1 & Cocoapods 1.0.1. Cập nhật: Vấn đề vẫn còn với Xcode 8.0

Với podfile này:

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

Trong lớp XCTest của tôi, tôi nhận được

Thiếu mô-đun cần thiết 'Firebase'

lỗi tại @testable import MyApp

Ngoài ra với podfile này:

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

Các bài kiểm tra được xây dựng nhưng bảng điều khiển của tôi chứa đầy các cảnh báo, ví dụ:

Lớp <-FirebaseClassName-> được triển khai trong cả ... MyApp ... và ... MyAppTests ... Một trong hai sẽ được sử dụng. Cái nào không xác định


Tôi chỉ sử dụng Firebase Analytics. Sau khi chuyển sang Google phân tích, mọi thứ hoạt động như một nét quyến rũ.
marosoaie

Tôi chưa thử bản thân mình nhưng tôi có thể cố gắng bao gồm Firebase theo cách thủ công không sử dụng vỏ ca cao: firebase.google.com/docs/ios/setup#frameworks
Jonny

1
Đây vẫn là một vấn đề
Edward

Câu trả lời:


84

Tôi gặp vấn đề tương tự. Tôi đã giải quyết nó bằng cách di chuyển pod 'Firebase'đến mục tiêu thử nghiệm của tôi. Thay đổi Podfile của bạn thành này:

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

Cảm ơn nhưng tôi đã thử nó và tôi vẫn có vấn đề "Lớp ... được triển khai trong cả hai ...".
doovers

1
Nó làm việc cho tôi nhưng nó vẫn không có ý nghĩa với tôi. Đây không phải là lần đầu tiên tôi có thể nói với Firebase đang thiết lập các podspec của họ một cách kỳ lạ, xem twitter.com/dundredhenry/status/836240557311684608 nhưng nhóm Firebase không trả lời :(
Dirty Henry

4
Thực hiện thay đổi này không ngay lập tức xóa cảnh báo, nhưng nó đã được giải quyết sau khi tôi chạy pod install.
blwinters

Một nửa vấn đề được giải quyết. và nửa còn lại được giải quyết bằng cách Thêm "$ {PODS_ROOT} / Firebase / Core / Nguồn" vào mục tiêu Thử nghiệm của bạn trong Cài đặt bản dựng -> Đường dẫn tìm kiếm tiêu đề
ArgaPK

Sau khi bạn thực hiện thay đổi này, đừng quên chạy pod installđể cập nhật các phụ thuộc của dự án;)
jawad

56

Hãy thử thay đổi quyền thừa kế thành :complete, như trong:

target 'MyAppTests' do
    inherit! :complete
end

Điều quan trọng là nó cho phép bất cứ ai khác kiểm tra repo của bạn chỉ cần làm pod updatenhư bình thường mà không phải sao chép .xcconfigcác tập tin hoặc tin tặc khác chỉ để xây dựng.


1
Điều này cũng có vấn đề "Lớp ... được triển khai trong cả hai ..."
Diogo T

Nó làm cho lỗi thời gian biên dịch biến mất, nhưng gây ra lỗi này trong thời gian chạy: clang: error: lệnh linker không thành công với mã thoát 1 (sử dụng -v để xem lời gọi)
CMont

Làm việc cho tôi là tốt! Cảm ơn :)
smapps

52
  1. Chọn cài đặt Mục tiêu kiểm tra đơn vị của bạn.
  2. Chuyển đến Cài đặt bản dựng.
  3. Tìm đường dẫn tìm kiếm tiêu đề.
  4. Thêm giá trị này $ (SRCROOT) / Pods với đệ quy, sau đó Xcode sẽ giải quyết đường dẫn cho bạn.

Thí dụ


1
Cảm ơn bạn @Kanika Sharma
Rahul K Rajan

34

Vấn đề là Firebase thực hiện một điều gì đó đặc biệt với Đường dẫn tìm kiếm tiêu đề sau khi CocoaPods tạo ra giá trị riêng cho cài đặt để Cốc Cốc không nhận được thay đổi này để mang nó đến mục tiêu thử nghiệm. Bạn có thể giải quyết một trong hai cách sau:

  1. Xác định vị trí MyAppTests.<configuration>.xcconfigtrong trình điều hướng tệp và thêm thông tin sau vào HEADER_SEARCH_PATHS:

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

  2. Tìm cài đặt cho Đường dẫn tìm kiếm tiêu đề trong Cài đặt bản dựng và thêm giá trị tương tự như trong tùy chọn 1 vào danh sách. Bạn không cần phải đặt nó là đệ quy.

* Theo nhận xét của AKM, điều này đã thay đổi thành ${PODS_ROOT}/Firebase/Core/Sourcesphiên bản 3.14.0


Đã thử điều đó nhưng vẫn nhận được cảnh báo tương tự
doovers

8
Kể từ Firebase 3.14.0 Giải pháp này là hợp lệ, tuy nhiên bản vá đã thay đổi thành${PODS_ROOT}/Firebase/Core/Sources
AKM

1
Con đường mới làm việc cho tôi là tốt! Tôi đang chạy Cốc Cốc phiên bản 1.2.0 , nhưng hãy nhớ rằng tôi cũng phải thêm inherit! :search_pathsvào mục tiêu thử nghiệm trong Podfile.
Paulo Mattos

2. không làm việc cho tôi. Sử dụng Firebase 3.x (không phải 4.x mới nhất)
Jonny

Vấn đề có thể được theo dõi tại đây: github.com/firebase/firebase-ios-sdk/issues/58
CMont

7

Ba bước trước khi tôi có thể làm việc này:

CacaoPods: 1.5.0 Swift 4 Firebase: 4.13.0

Bước 1: Đảm bảo thêm khối mục tiêu sau vào podfile của bạn.

# 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

Bước 2: Trong tab Cài đặt Xây dựng Trình điều hướng Dự án YourAppTests. Tìm hàng Đường dẫn tìm kiếm tiêu đề và thêm vào Gỡ lỗi dòng sau

$ (được kế thừa) $ {PODS_ROOT} / Firebase / Core / Nguồn

Bước 3: Trong thiết bị đầu cuối chạy:

cập nhật nhóm


7

Vấn đề được ghi lại trong dự án căn cứ hỏa lực ở đây:

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

Có một cách giải quyết:

Thêm "$ {PODS_ROOT} / Firebase / Core / Nguồn" vào mục tiêu Thử nghiệm của bạn chỉ trong Cài đặt bản dựng -> Đường dẫn tìm kiếm tiêu đề

nhưng điều này cũng được khắc phục bằng cách nâng cấp lên CocoaPods 1.4.0 trở lên, đây là một giải pháp tốt hơn.

Tại thời điểm tôi đang viết bài này (tháng 11 năm 2017) cocoapods 1.4.0 vẫn đang trong giai đoạn thử nghiệm, vì vậy để cài đặt nó, bạn cần yêu cầu rõ ràng bản beta:

gem install cocoapods --pre

Điều này và sau đó làm một pod installgiải quyết vấn đề chạy thử nghiệm của tôi.


1
"PODS_ROOT" là gì ??
ArgaPK

@ArgaPK Đó là một biến mà cocoapods đặt. Chỉ cần dán chính xác những gì tôi đã viết giữa "" vào Xcode. Thực sự cách tốt nhất là nâng cấp Cốc Cốc của bạn lên> = 1.4.0.
JosephH

1
@JosephH cập nhật cocoapods của tôi lên 1.5.2 không giải quyết được vấn đề.
Stacy Smith

@AnastasiaKovaleva bạn đã chạy pod installsau khi nâng cấp?
JosephH

@JosephH Chạy pod installgiải quyết vấn đề của tôi! Cảm ơn rất nhiều!
Stacy Smith

4

Giải pháp cho tôi là cập nhật cocoapods lên phiên bản 1.1.0.rc.2.

sudo gem install cocoapods --pre


Thật không may, nó không hoạt động với tôi ... Tôi phải lấy lại upvote của mình!
Zeb

Xin lỗi nó không giúp bạn guys, không chắc chắn lý do tại sao nó giải quyết được vấn đề đối với tôi và không ...
doovers

Tôi vào ngày 1.20 và không gặp may mắn
UKDataGeek

4

Tôi đã thử tất cả các lỗi trên và gặp phải nhiều lỗi khác nhau, ban đầu bắt đầu bằng Missing required module 'Firebase', sau đó gặp sự cố "Class ... is implemented in both ... "hoặc liên kết nếu tôi cố thêm Firebase Pods vào mục tiêu thử nghiệm của mình.

Giải pháp hiệu quả với tôi là:

  1. Xóa hoàn toàn mục tiêu thử nghiệm khỏi Podfile và chạy 'cập nhật nhóm' để đảm bảo dự án XCode được đồng bộ hóa.
  2. Mở Cài đặt bản dựng của mục tiêu thử nghiệm của tôi và cập nhật đường dẫn tìm kiếm tiêu đề để chỉ bao gồm 3 mục sau:
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

Tại thời điểm này làm sạch thư mục xây dựng, xây dựng lại sau đó chạy lại các thử nghiệm làm việc cho tôi. Hy vọng điều này sẽ giúp được ai đó!


Sau khi thử mọi thứ khác trên chủ đề này - đây là câu trả lời duy nhất có những thứ làm việc cho tôi. Cảm ơn bạn!
Ali Parr

4

Việc thêm ${SRCROOT}/Pods/Firebase/CoreOnly/Sourcesvào "đường dẫn tìm kiếm tiêu đề" của mục tiêu kiểm tra đơn vị đã khắc phục sự cố. Các bước:

  1. Chọn mục tiêu kiểm tra đơn vị của bạn
  2. Chuyển đến Cài đặt bản dựng
  3. Tìm kiếm đường dẫn tìm kiếm tiêu đề
  4. Thêm $ {SRCROOT} / Pods / Firebase / CoreOnly / Nguồn

nhập mô tả hình ảnh ở đây

Sau đó, các bài kiểm tra có thể chạy và lỗi sẽ biến mất.


2

Tôi đã có một vấn đề tương tự. Phrased về câu hỏi của bạn, tôi đã sao chép nội dung của MyApp.<configuration>.xcconfigtập tin của tôi vào MyAppTests.<configuration>.xcconfigtập tin của tôi . Tôi đã làm sạch và xây dựng các bài kiểm tra, và nó đã hoạt động.


Đây là giải pháp duy nhất hiệu quả với tôi. Cảm ơn! Tôi đang suy nghĩ về việc xử lý cài đặt bài đăng trong Podfile làm việc này
SauloT

1

Thêm "$ {PODS_ROOT} / Firebase / Core / Nguồn" vào mục tiêu Thử nghiệm của bạn chỉ trong Cài đặt bản dựng -> Đường dẫn tìm kiếm tiêu đề


Nó là gì ? PODS_ROOT
ArgaPK

nó sẽ tìm nạp thư mục cho pod
Karthick Vade xoay

1

Như @Will đã đề cập đến một vấn đề xung quanh Đường dẫn tìm kiếm tiêu đề sau khi cài đặt CocoaPods.

Tôi có một dự án với nhiều mục tiêu trong đó nhóm 'Firebase' được nhúng vào mô-đun riêng biệt, giả sử MyProject-Shared . Nhóm Firebase tại 'Podfile' chỉ được cài đặt cho mục tiêu 'MyProject-Shared'. Các mô-đun khác muốn sử dụng 'MyProject-Shared' không thể được biên dịch do lỗi:

'thiếu mô-đun cần thiết "Firebase"'

Thủ thuật trong trường hợp của tôi là thêm đường dẫn tìm kiếm tiêu đề bị thiếu sau vào mỗi Cài đặt bản dựng của mục tiêu tham chiếu đến Analytics-Framework :

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

Xin vui lòng xem pic dưới đây: Đường dẫn tìm kiếm tiêu đề

Hy vọng nó sẽ tiết kiệm thời gian của bạn.


1

Một phương pháp đơn giản hơn cũng hoạt động:

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

    target :MyAppTests
end

0

Missing required module Firebase Không có giải pháp CacaoPods

Đối với những người gặp phải vấn đề tương tự nhưng KHÔNG sử dụng CocoaPods:

Nếu bạn đang sử dụng Firebase, bạn có một số thư mục chứa Firebase.hmodule.modulemaptệp. Ví dụ -YOUR_PROJECT_DIR/Linking

Nếu mục tiêu dự án chính của bạn đang hoạt động chính xác, thì bạn nên truy cập ProjectSinstall -> Target. Chọn mục tiêu thử nghiệm. Tìm kiếm User headersvà thêm đường dẫn đến YOUR_PROJECT_DIR/Linking. Chọn recursivetùy chọn và bạn sẽ tốt để đi.

Xem ảnh chụp màn hình để biết thêm chi tiết:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.