Cocoapods를 사용한 Xcode 단위 테스트


119

나는 지난 며칠 동안 이것으로 벽에 머리를 부딪 혔지만 여러 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 2011

나는 그의 자신을 아직 시도하지 않은하지만 난 코코아 포드를 사용하지 않는 수동으로 중포 기지를 포함하도록 시도 할 수 있습니다 : firebase.google.com/docs/ios/setup#frameworks을
조니

1
이것은 여전히 문제입니다
에드워드

답변:


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 ... is implementation in both ..."문제가 있습니다.
doovers

1
그것은 나를 위해 일했지만 여전히 나에게는 의미가 없습니다. Firebase가 podspec을 이상하게 설정하고 있다고 말할 수있는 것은 이번이 처음이 아닙니다. 참조. twitter.com/dirtyhenry/status/836240557311684608 하지만 중포 기지 팀은 :( 응답하지 않습니다
더러운 헨리에게

4
이렇게 변경해도 경고가 즉시 지워지지는 않았지만를 실행 한 후에 해결되었습니다 pod install.
blwinters

절반의 문제가 해결되었습니다. > 헤더 검색 경로 - 그리고 나머지 절반은 테스트에 추가 "$ {PODS_ROOT} / 중포 기지 / 코어 / 소스"에 의해 대상에만 빌드 설정에 따라 해결된다
ArgaPK

이렇게 변경 한 후에는 pod install프로젝트 종속성을 업데이트하기 위해 실행하는 것을 잊지 마십시오 .)
jawad

57

다음 :complete과 같이 상속을로 변경해보십시오 .

target 'MyAppTests' do
    inherit! :complete
end

중요한 것은 다른 사람들이 당신의 repo를 체크 아웃 할 때 파일이나 다른 해커 pod update를 복사하지 않고도 평상시처럼 할 수있게 해줍니다 .xcconfig.


1
이것은 또한 "Class ... is implementation in both ..."문제
Diogo T

컴파일 시간 오류가 사라지게 만들었지 만 런타임에이 오류가 발생했습니다. clang : error : linker command failed with exit code 1 (use -v to see invocation)
CMont

나를 위해 일했습니다! 감사합니다 :)
smapps

52
  1. 단위 테스트 대상 설정을 선택합니다.
  2. 빌드 설정으로 이동합니다.
  3. 헤더 검색 경로를 찾으십시오.
  4. 이 값 $ (SRCROOT) / Pods를 재귀 적으로 추가하면 Xcode가 경로를 확인합니다.


1
@Kanika Sharma 감사합니다
Rahul K Rajan

34

문제는 CocoaPods가 설정에 대한 자체 값을 생성 한 후 Firebase가 헤더 검색 경로와 관련하여 특별한 작업을 수행하므로 CocoaPod가 테스트 대상으로 전달하기 위해이 변경 사항을 선택하지 않는다는 것입니다. 다음 두 가지 방법 중 하나로이 문제를 해결할 수 있습니다.

  1. 찾은 MyAppTests.<configuration>.xcconfig파일 탐색기에서와에 다음을 추가합니다 HEADER_SEARCH_PATHS:

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

  2. 빌드 설정에서 헤더 검색 경로 에 대한 설정을 찾고 옵션 1에서와 동일한 값을 목록에 추가하십시오. 재귀로 설정할 필요가 없습니다.

* AKM의 의견에 따라 ${PODS_ROOT}/Firebase/Core/Sources3.14.0 버전에서 변경되었습니다.


시도했지만 여전히 동일한 경고가
표시됨

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 아님) 사용
Jonny

문제는 여기에서 따를 수 있습니다. 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 프로젝트 네비게이터 빌드 설정 탭 내에서. 헤더 검색 경로 행을 찾아 디버그에 다음 행을 추가하십시오.

$ (상 속됨) $ {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 년 11 월) cocoapods 1.4.0은 아직 베타 버전이므로 설치하려면 명시 적으로 베타를 요청해야합니다.

gem install cocoapods --pre

이것은 pod install내 테스트를 실행하는 문제를 해결했습니다.


1
"PODS_ROOT"는 무엇입니까 ??
ArgaPK

@ArgaPK cocoapods가 설정하는 변수입니다. ""사이에 쓴 내용을 Xcode에 정확히 붙여 넣으십시오. 정말 가장 좋은 방법은 CocoaPods를> = 1.4.0으로 업그레이드하는 것입니다.
JosephH dec.

1
내 cocoapods를 1.5.2로 업데이트하는 @JosephH는 불행히도 문제를 해결하지 못했습니다.
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 포드를 테스트 대상에 추가하려고하면 링커 문제가 발생했습니다.

나를 위해 일한 솔루션은 다음과 같습니다.

  1. Podfile에서 테스트 대상을 완전히 제거하고 'pod update'를 실행하여 XCode 프로젝트가 동기화되었는지 확인합니다.
  2. 내 테스트 대상의 빌드 설정을 열고 다음 3 개 항목 만 포함하도록 헤더 검색 경로를 업데이트합니다.
    • $(inherited) non-recursive
    • $(SRCROOT)/Pods/Headers/Public recursive
    • $(SRCROOT)/Pods/Firebase recursive

이 시점에서 빌드 폴더를 정리하고 다시 빌드 한 다음 테스트를 다시 실행하면 저에게 효과적이었습니다. 이것이 누군가를 돕기를 바랍니다!


이 스레드에서 다른 모든 것을 시도한 후-이것이 나를 위해 일하는 유일한 대답이었습니다. 감사합니다!
Ali Parr

4

추가 ${SRCROOT}/Pods/Firebase/CoreOnly/Sources문제를 해결 단위 테스트 대상의 "헤더 검색 경로"로. 단계 :

  1. 단위 테스트 대상 선택
  2. 빌드 설정으로 이동
  3. 검색 헤더 검색 경로
  4. 추가 $ {SRCROOT} / 포드 / 중포 기지 / CoreOnly / 소스

여기에 이미지 설명 입력

이 후 테스트를 실행할 수 있으며 오류가 사라집니다.


2

비슷한 문제가있었습니다. 귀하의 질문에 따라 내 MyApp.<configuration>.xcconfig파일 의 내용을 내 파일에 복사했습니다 MyAppTests.<configuration>.xcconfig. 나는 테스트를 청소하고 구축했으며 작동했습니다.


이것은 나를 위해 일한 유일한 솔루션이었습니다. 감사! 나는 약 게시물이하고있는 Podfile에서 처리 설치합니까 생각하고 있어요
SauloT

1

추가 "$ {PODS_ROOT} / 중포 기지 / 코어 / 소스" 하에서 만 대상으로하여 시험에 빌드 설정 -> 헤더 검색 경로


뭐야? PODS_ROOT
ArgaPK

그것은 포드에 대한 디렉토리를 가져옵니다
Karthick Vadivel에게

1

@Will은 주변에 문제가 언급 한 헤더 검색 경로를 CocoaPods 설치 후.

pod 'Firebase'가 별도의 모듈에 포함 된 여러 대상이있는 프로젝트가 있습니다 MyProject-Shared. 'MyProject-Shared'대상에 대해서만 설치된 'Podfile'의 Firebase 포드입니다. 'MyProject-Shared'를 사용하려는 다른 모듈은 오류로 인해 컴파일 할 수 없습니다.

'필수 모듈'Firebase '누락'

필자의 경우 트릭은 Analytics-Framework를 참조하는 대상의 빌드 설정 에 다음 누락 된 헤더 검색 경로를 추가하는 것입니다 .

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

아래 그림을 참조하십시오 : 헤더 검색 경로

시간을 절약 할 수 있기를 바랍니다.


1

작동하는 더 간단한 방법 :

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

    target :MyAppTests
end

0

Missing required module Firebase CocoaPods 솔루션 없음

같은 문제가 발생하지만 CocoaPods를 사용하지 않는 사람들을 위해 :

Firebase를 사용하는 경우 Firebase.hmodule.modulemap파일이 포함 된 일부 폴더가 있습니다. 예를 들면-YOUR_PROJECT_DIR/Linking

주 프로젝트 대상이 올바르게 작동하는 경우 ProjectSettings-> Targets로 이동해야합니다. 테스트 대상을 선택하십시오. User headers경로를 검색 하여 YOUR_PROJECT_DIR/Linking. recursive옵션을 선택 하면 잘 될 것입니다.

자세한 내용은 스크린 샷을 참조하십시오.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.