iOS 로직 테스트와 함께 CocoaPod를 사용할 때 라이브러리를 찾을 수 없음
저는 제 팟스펙의 일부 라이브러리에서 기능을 사용하는 제 프로젝트의 클래스에 대해 iOS 로직 테스트를 작성하려고 합니다.저는 Xcode에 제공된 표준 단위 테스트 번들을 사용하고 있습니다(Application Tests는 아니지만, Unit Tests만 사용).
예를 들어, 저는 마법의 레코드를 사용하고, 그 라이브러리는 제 팟스펙에 연결되어 있습니다.이것은 제 작업 공간의 포드 프로젝트에 있으며, 앱이 시뮬레이터나 기기에서 실행될 때 예상대로 작동합니다.그러나 Magic Record를 사용하는 개체를 테스트에 연결하려고 하면 Magic Record에서 Selector를 찾을 수 없다는 링커 오류가 발생합니다.논리 테스트 번들에서 HEADER_SEARCH_PATH를 업데이트하고 코코아팟에서 만든 헤더 디렉토리에 하드 코딩까지 시도했지만 실패했습니다.
코코아팟 라이브러리를 사용하지 않는 클래스에 대해 단위 테스트를 문제 없이 실행할 수 있습니다.
제가 잘못 생각하고 있는 건가요?컴파일러가 코코아 포드 라이브러리를 볼 수 있도록 다른 작업을 수행해야 합니까?
코코아 포드 1.0은 이에 대한 구문을 변경했습니다.이제 다음과 같이 표시됩니다.
def shared_pods
pod 'SSKeychain', '~> 0.1.4'
...
end
target 'Sail' do
shared_pods
end
target 'Sail-iOS' do
shared_pods
end
이전 코코아 포드 1.0 정답
사용하고자 하는 것은 다음과 같습니다.Podfile
다음과 같은 것:
link_with 'MainTarget', 'MainTargetTests'
다음 그럼실을 실행합니다.pod install
한 번
저는 제 앱의 주요 대상이 어떻게 코코아 포드 라이브러리에서 설정을 수신하는지를 보고 이것을 이해했습니다.코코아 포드에는 Pods.xccconfig라는 .xccconfig 파일이 포함되어 있습니다.이 파일에는 모든 헤더 검색 경로가 포함되어 있습니다.
프로젝트 탐색기에서 프로젝트를 보고 정보 탭을 클릭하면 맨 위 섹션에 빌드 구성이 나열됩니다.다른 구성에 대한 노출 삼각형을 열면 기본 대상 아래에 포드가 나열됩니다.저는 드롭다운을 클릭하고 논리 테스트 대상에도 포드를 추가해야 했습니다.
는 또한 또한설복했습다니야사의 .$(inherited)
그리고.${PODS_HEADERS_SEARCH_PATHS}
기본 대상에서 빌드 설정/HEADER_SEARCH_PATHs 아래의 논리 테스트 대상으로 복사합니다.
마지막으로 논리 테스트 대상을 위해 라이브러리가 포함된 링크 바이너리 빌드 단계에서 libPods.a를 추가해야 했습니다.
이것이 다른 사람을 도울 수 있기를 바랍니다.
여기서 찾은 솔루션이 있습니다. 코코아 포드를 사용한 유닛 테스트:
Xcode에서 프로젝트 파일을 열고 대상이 아닌 프로젝트를 선택합니다. 오른쪽 패널에는 Configurations(구성) 섹션이 있습니다.테스트 대상의 "구성 파일 기반" 열에서 포드를 선택합니다.
저는 도서관을 시험 대상과 연결하는 것이 필요하다는 다른 답변에 동의합니다.하지만 지금까지의 제안 중 어느 것도 저에게 도움이 되지 않았습니다.바와 같이, ", @fabb 논평말서했듯이때테할에트: "스가트할때,,isSubclassOfClass:
호출은 "예"를 반환해야 하는 위치에 "아니오"를 반환합니다.이것을 설명할 수 있는 유일한 이유는 종속성이 실제로 주 대상과 테스트 대상 모두에 연결되고, 테스트 대상의 번들 로더가 주 번들을 로드할 때 어떤 클래스를 수강할지 결정할 수 없기 때문입니다."저는 이 스레드에서 이전의 모든 제안에 동일한 문제가 발생합니다.
작업에 착수한 솔루션은 주요 대상과 테스트 대상에 대한 특정 포드를 정의하도록 포드 파일을 업데이트하는 것이었습니다.
target 'MyTarget' do
pod 'AFNetworking', '~> 2.5.0'
pod 'Mantle', '~> 1.5'
end
target 'MyTargetTests' do
pod 'OCMockito', '~> 1.3.1'
end
테스트별 포드를 사용하지 않았는데도 테스트 대상에 대한 Pod를 지정해야 했습니다.그렇지 않으면 코코아 포드는 제 프로젝트에 필요한 연결 로직을 삽입하지 않을 것입니다.
이 연결고리가 제가 이 결론에 도달하는 데 도움이 되었습니다.
추가했습니다.:exclusive => true
응용 프로그램 테스트 대상에서 중복된 기호 오류를 방지합니다.
target 'myProjectTests', :exclusive => true do
pod 'OCMock', :head
pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end
link_with 'myProject', 'myProjectTests'
애플리케이션 테스트 대상을 로직 유닛 테스트 대상으로 변경했을 때 링커 오류가 발생합니다.가 제거후를 제거한 에.:exclusive => true
모든 것이 다시 작동합니다.
target 'myProjectTests', do
pod 'OCMock', :head
pod 'XCTAsyncTestCase', :git => 'https://github.com/iheartradio/xctest-additions.git'
end
link_with 'myProject', 'myProjectTests'
:exclusive => true
외부의 모든 것이do...end
에연서는안됩다니해결에 는 안 .myProjectTests
응용 프로그램 테스트 대상에서는 합리적이지만 논리 테스트 대상에서는 링커 오류가 발생합니다.
@Keith Smiley 솔루션에 따라 link_with를 사용할 수 있습니다.
공통 포드와 각 대상에 대한 세부 사항이 있는 경우 "def" 옵션을 사용하여 포드 그룹을 정의하고 나중에 "def"를 단독 대상에 사용할 수 있습니다.
def import_pods
pod 'SSKeychain'
end
target 'MyProjectTests', :exclusive => true do
import_pods
end
target 'MyProject', :exclusive => true do
import_pods
pod 'Typhoon'
end
위의 예에서는 두 대상 모두에 'SSKeychain'을 추가하고 'MyProject' 대상에만 'Typhoon'을 추가했습니다.
이 문제에 대한 저의 해결책은 다음과 같이 두 대상에 라이브러리를 포함하도록 Pod 파일을 변경하는 것이었습니다.
target "MyApp" do
pod 'GRMustache', '~> 7.0.2'
end
target "MyAppTests" do
pod 'GRMustache', '~> 7.0.2'
end
하고 있기 대상에 swift를 .MyApp-Bridging-Header.h
(탭 Swift 에 있음) file. (Build Settings (빌드 설정) Swift 파일)
버전을 제어하는 동안 일부 라이브러리 파일을 분실했을 때도 비슷한 일이 있었습니다.나는 여전히 내 포드에서 라이브러리 파일을 보았지만 실제 코드가 없어 XCode에서 사라졌다고 말했습니다.실망스럽게도 'Pod install'을 실행해도 손실된 파일이 즉시 복구되지 않았습니다.
다음 작업을 수행하여 수동으로 포드를 제거하고 교체해야 했습니다.
- Pod 파일에서 라이브러리 제거
- 'pod install'을 실행하여 라이브러리를 완전히 제거합니다.
- 라이브러리를 포드 파일에 다시 저장
- 'Pod 설치'를 다시 실행합니다.
이렇게 하면 문제의 라이브러리가 원래의 형태로 돌아갈 수 있습니다.
또한 만약 당신이 이 사건을libPods.a
번 과 같은 합니다.
232 duplicate symbols for architecture i386
수정하려면 다음 중 하나를 삭제합니다.libPods.a
프로젝트 탐색기에서 참조할 수 있습니다.
코코아 포드 1.x부터는 대상과 해당 테스트 대상 간에 공유 종속성을 선언하는 새로운 방법이 있습니다.저는 지금까지 Mark Struzinski에 의해 승인된 솔루션을 사용해 왔지만, 이 방법을 사용하면 테스트를 실행할 때 다음과 같은 엄청난 수의 경고가 발생했습니다.
Class SomeClass is implemented in both /Path/To/Test/Target and /Path/To/App/Target. One of the two will be used. Which one is undefined.
코코아 포드 1.x에서는 다음과 같이 상위 대상의 검색 경로를 통해 -Test 대상을 상속으로 선언할 수 있습니다.
target 'MyApp' do
pod 'aPod'
pod 'anotherPod'
project 'MyApp.xcodeproj'
end
target 'MyAppTests' do
inherit! :search_paths
project 'MyApp.xcodeproj'
end
이렇게 하면 -테스트 대상이 여러 이진 복사본 없이 앱 대상의 종속성에 액세스할 수 있습니다.이로 인해 테스트 빌드 시간이 크게 단축되었습니다.
해봐요, 이건 나한테 효과가 있어요
구성에 포드를 설정해야 합니다.
Project->Info->Xcode 프로젝트(당신의 프로젝트)의 구성은 디버깅, 릴리스 및 기타 사용자가 가지고 있는 것을 위해 메인 프로젝트 'Pods'로 설정해야 합니다."헤더를 찾을 수 없음 – 검색 경로가 포함되지 않음"을 참조하십시오.
이것이 누군가에게 도움이 되기를 바랍니다.
저는 제 Swift 앱을 사용하여 iOS에서 Google Maps Objective-CPOD 통합 작업을 하고 있습니다. 따라서 문제는 테스트 대상이 빌드 설정에서 브리지 헤더 파일(SWIFT_OBC_BRIDGE_HEADER)에 대한 참조가 없다는 것입니다.서드파티 API 호출(맵 API 등)이 신속한 단위 테스트에 사용될 수 있도록 앱과 테스트 앱 대상이 모두 이를 가리키는지 확인합니다.
다음 구문은 최상의 결과를 제공합니다(cocoapod v.1.2.1에서 테스트됨).
https://github.com/CocoaPods/CocoaPods/issues/4626#issuecomment-210402349
target 'App' do
pod 'GoogleAnalytics' , '~> 3.0'
pod 'GoogleTagManager' , '~> 3.0'
pod 'SDWebImage', '~>3.7'
platform :ios, '8.0'
use_frameworks!
target 'App Unit Tests' do
inherit! :search_paths
end
end
이것이 없으면 중복 기호에 대한 테스트 실행 중에 경고가 발생합니다.
이 경고는 이후에 사라졌습니다.
XCTest에서 OpenCV를 사용하는 데 문제가 있었습니다.그것은 나에게 링커 오류를 주고 있었습니다.Undefined symbols for architecture arm64
와 같은 수업을 위해cv::Mat
다음을 사용하여 코코아 포드를 통해 OpenCV를 설치하고 있습니다.pod 'OpenCV', '~> 2.0'
주표적하에OpenCV 종속성을 테스트 대상에 넣거나 사용하려고 아무리 노력해도inherit! :search_paths
아무 것도 효과가 없었습니다.해결책은 다음과 같습니다.abstract_target
이와 같이:
# Uncomment the next line to define a global platform for your project
platform :ios, '6.1.6'
abstract_target 'Shows' do
pod 'RMVision', path: '../..'
pod 'RMShared', path: '../../../RMShared'
pod 'OpenCV', '~> 2.0'
target 'RMVisionSample' do
# Uncomment the next line if you're using Swift or would like to use dynamic frameworks
# use_frameworks!
# Pods for RMVisionSample
end
target 'RMVisionSampleTests' do
# inherit! :search_paths
# Pods for testing
end
target 'RMVisionBenchmarks' do
# inherit! :search_paths
# Pods for testing
end
end
또한 유용한 것은pod deintegrate
&pod clean
프로젝트를 정리하고 테스트할 때 새로 시작하는 데 도움이 되는 명령입니다.다음을 사용하여 이 두 가지를 설치할 수 있습니다.[sudo] gem install cocoapods-deintegrate cocoapods-clean
.
언급URL : https://stackoverflow.com/questions/14512792/libraries-not-found-when-using-cocoapods-with-ios-logic-tests
'it-source' 카테고리의 다른 글
img [src] 동적 변경 (0) | 2023.07.15 |
---|---|
Firebase 인증 vs AWS Cognito (0) | 2023.07.15 |
스크립트 하나에 여러 트리거를 생성하는 방법이 있습니까? (0) | 2023.07.15 |
문자열에서 모든 공백을 제거하는 방법은 무엇입니까? (0) | 2023.07.15 |
충돌 업데이트 시 삽입 일부 필드를 사용하여 Postgres가 있는 Spring Data/Hibernate 저장 엔티티 (0) | 2023.07.15 |