내 podspec의 일부 라이브러리에서 기능을 사용하는 프로젝트의 클래스에 대해 iOS 논리 테스트를 작성하려고합니다. Xcode에서 제공하는 표준 단위 테스트 번들을 사용하고 있습니다 (응용 프로그램 테스트는 아니지만 단위 테스트 만 가능).
예를 들어, Magical Record를 사용하고 해당 라이브러리를 podspec에 연결했습니다. 내 작업 공간의 포드 프로젝트에 있으며 앱이 시뮬레이터 또는 장치에서 실행될 때 예상대로 작동합니다. 그러나 Magical Record를 사용하는 객체를 테스트에 연결하려고하면 Magical Record에서 선택기를 찾을 수 없다는 링커 오류가 발생합니다. 논리 테스트 번들에서 HEADER_SEARCH_PATH를 업데이트하려고 시도했지만 CocoaPods가 만든 헤더 디렉토리로 하드 코딩했지만 운이 없습니다.
문제없이 CocoaPods 라이브러리를 사용하지 않는 클래스에 대해 단위 테스트를 실행할 수 있습니다.
내가 잘못 가고 있습니까? 컴파일러가 CocoaPods 라이브러리를 볼 수 있도록 다른 작업을 수행해야합니까?
답변
CocoaPods 1.0이 이에 대한 구문을 변경했습니다. 이제 다음과 같이 보입니다 :
def shared_pods
pod 'SSKeychain', '~> 0.1.4'
...
end
target 'Sail' do
shared_pods
end
target 'Sail-iOS' do
shared_pods
end
사전 CocoaPods 1.0 답변
당신이 사용하려는 것은 link_with
에서 Podfile
입니다. 다음과 같은 것 :
link_with 'MainTarget', 'MainTargetTests'
그런 다음 pod install
다시 실행 하십시오.
답변
내 앱의 주요 대상이 CocoaPods 라이브러리에서 설정을받는 방법을 살펴보면서이 사실을 알았습니다. CocoaPods에는 Pods.xcconfig라는 .xcconfig 파일이 포함되어 있습니다. 이 파일에는 모든 헤더 검색 경로가 포함됩니다.
프로젝트 탐색기에서 프로젝트를보고 정보 탭을 클릭하면 맨 위 섹션에 빌드 구성이 나열됩니다. 다른 구성에 대해 펼침 삼각형을 열면 기본 대상 아래에 포드가 표시됩니다. 드롭 다운을 클릭하고 로직 테스트 대상에도 포드를 추가해야했습니다.
또한의 설정을 복사했다 $(inherited)
및 ${PODS_HEADERS_SEARCH_PATHS}
HEADER_SEARCH_PATHS / 내 주요 목표로하고 빌드 설정에서 논리 테스트 대상을 통해 복사합니다.
마지막으로, 로직 테스트 대상에 대한 라이브러리와 바이너리 빌드 링크 단계에서 libPods.a를 추가해야했습니다.
이것이 다른 사람을 도울 수 있기를 바랍니다.
답변
여기에 CocoaPods를 사용한 단위 테스트 솔루션이 있습니다 .
Xcode에서 프로젝트 파일을 연 다음 프로젝트 (대상이 아닌)를 선택하십시오. 오른쪽 패널에는 구성이라는 섹션이 있습니다. 테스트 대상의 “구성 파일 기반”열에서 포드를 선택하십시오.
답변
라이브러리를 테스트 대상에 연결해야한다는 다른 답변에 동의합니다. 그러나 지금까지 제안 사항 중 어느 것도 도움이되지 않았습니다. @fabb는 다음과 같이 주석을 작성합니다. “테스트 할 때 isSubclassOfClass:
호출은 YES를 반환해야하는 곳에서 NO를 반환합니다. 이것을 설명 할 수있는 유일한 이유는 종속성이 실제로 주 대상과 테스트 대상, 그리고 테스트 대상의 번들에 연결되어 있기 때문입니다. 로더가 기본 번들을로드하므로 어떤 클래스를 수행할지 결정할 수 없습니다. ” 이 스레드의 모든 이전 제안과 동일한 문제가 발생합니다.
내가 해결해야 할 해결책은 내 주요 대상과 테스트 대상에 대한 특정 포드를 정의하기 위해 Podfile을 업데이트하는 것입니다.
target 'MyTarget' do
pod 'AFNetworking', '~> 2.5.0'
pod 'Mantle', '~> 1.5'
end
target 'MyTargetTests' do
pod 'OCMockito', '~> 1.3.1'
end
이었다 필요 내가 어떤 테스트 특정 포드를 사용하지 않은 경우에도 내 테스트 대상에 대한 포드를 지정할 수 있습니다. 그렇지 않으면 CocoaPods가 프로젝트에 필요한 연결 논리를 삽입하지 않습니다.
이 링크 는이 결론에 도달하는 데 도움이되었습니다.
답변
: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’을 추가했습니다.
답변
이 문제에 대한 나의 해결책은 Podfile을 다음과 같이 두 대상 모두에 라이브러리를 포함하도록 변경하는 것입니다.
target "MyApp" do
pod 'GRMustache', '~> 7.0.2'
end
target "MyAppTests" do
pod 'GRMustache', '~> 7.0.2'
end
그리고 swift를 사용하고 있기 때문에 MyApp-Bridging-Header.h
파일 을 포함하도록 테스트 대상을 구성해야했습니다 . (빌드 설정 탭의 Swift Compiler 그룹에서)