Xcode 14.2 환경에서 신규 프로젝트를 생성하고, 유닛 테스트 실행시 RxSwift의 중복 적재 경고를 확인 했습니다. 이 문제를 해결해봅시다.

저는 이 문제를 해결하려고 6시간 이상을 삽질했으므로…… 누군가에게 도움이 되길 바랍니다.

Update

  • 포스트 작성일 23년 4월 2일 기준으로 Xcode 14.3에서도 동일하게 발생하고 있습니다.

Refs

재현 환경

  • Xcode 14.2
  • Swift 5.7

프로젝트 구조

target tests

순수하게 SPM만을 사용하는 프로젝트이며, App Target에서는 RxSwift, RxCocoa, RxRelay를 사용하고 있습니다.
Tests Target에서는 RxTestRxBlocking을 사용하고 있습니다.

문제

objc[2204]: Class
~~~ is implemented in both
~~/SPMPlayground.app/SPMPlayground (0x10462f900) and
~~/SPMPlayground.app/PlugIns/SPMPlaygroundTests.xctest/SPMPlaygroundTests (0x10dfbb530).
One of the two will be used. Which one is undefined.

테스트는 동작하지만, 상기와 같은 중복 적재에 대한 경고를 알려옵니다.
굉장히 찜찜하기 때문에, 먼저 문제를 해결 해봅시다.

해결법

Tests Target에서 TEST_HOST를 검색합니다.
test-host

뭔가 이상한 점이 눈에 띄지 않나요?
TEST_HOST 값을 들여다보면, 문자열 //이 존재하는 것을 확인할 수 있습니다.

test-host-detail

우리는 이 TEST_HOST값을 통해 $(BUNDLE_EXECUTABLE_FOLDER_PATH)가 빈 디렉토리거나 존재하지 않다는 것을 추측할 수 있습니다. 이 값을 지운 뒤, 테스트를 다시 실행 해보겠습니다.

test-host-detail

중복 적재 에러가 사라진 것을 확인할 수 있습니다.

왜 이런 문제가 발생할까? (이하 뇌피셜)

Xcode 14 버그로 추측 하고 있습니다.

참고했던 민소네님의 SwiftPM로 RxSwift 사용할 때 RxBlocking, RxTest를 유닛테스트에서 사용하기 - 해결편에서 언급하신 SR-12303에 해결법이 코멘트 되어 있습니다.

같은 설정의 macOS 프로젝트에선 정상 동작을 확인할 수 있습니다. mac-target mac-tests mac-test-host