Xcode 단위 테스트에서 @testable을 사용할 때 "해당 모듈 없음"


168

최근에 Xcode 7 베타 5로 업데이트했습니다. 이전 프로젝트에 단위 테스트를 추가하려고했지만 "No such module [myModuleName]"오류 메시지가 표시 @testable import myModuleName됩니다.

여기에 이미지 설명을 입력하십시오

나는 시도했다

  • OptionClean Build Folder로 프로젝트 정리
  • 빌드 옵션에서 "테스트 가능"(디버그)이 예로 설정되어 있는지 확인
  • 테스트 대상을 삭제 한 후 iOS 단위 테스트 번들을 다시 추가

이 프로젝트에서는 아무것도 작동하지 않았습니다 (그러나 다른 프로젝트에서 작업하기 위해 테스트를 받았습니다). 다른 사람 이이 문제를 겪고 해결 했습니까?



xcodebuild를 사용하여 명령 행에서 빌드하는 경우 빌드 명령에 -workspace 플래그를 추가하십시오. 트래비스 빌드 에서이 문제를 해결했습니다.
빅터 '크리스'Cabral

답변:


210

가져 오려는 모듈 이름을 확인하십시오 @testable import "ModuleName". 모듈 이름은 동일해야합니다.Target->Build Settings-> Product Module Name


5
대부분의 경우 제품 모듈 이름에 관한 것입니다. 확인 space하고_
onmyway133

5
조심 -하고 _. 내 프로젝트 중 하나의 -이름 은 마이너스 이지만 모듈 _대신 밑줄이 있습니다
베릴륨

4
나는 그 ""아이디어를 사용 했고Expected identifier in import declaration
12

1
@ onmyway133은 매우 가까웠습니다. 제 경우에는 프로젝트 이름과 다른 제품 모듈 이름이있었습니다. 모듈 이름을 찾으려면 Build Settings(테스트 또는 UI 테스트가 아닌) 프로젝트 를 선택한 다음 PRODUCT_MODULE_NAME표시되어야 할 항목 을 검색하십시오.@testable import
jonmecer

115

나를 위해 일한 대답

대답은 빌드에 실패한 프로젝트에 오류가 있다는 것입니다. (코드의 매일 버그 일뿐입니다.) 오류를 수정하고 다른 깨끗하고 빌드 한 후에 효과가있었습니다.

이 오류는 처음에는 나타나지 않았습니다. 그들이 나타나게하려면 :

  • "No such module"오류를 발생시키는 전체 테스트 파일을 주석 처리하십시오.
  • 프로젝트를 다시 실행하십시오.

다른 오류가 있으면 지금 표시해야합니다. 수정 한 다음 테스트 파일 코드의 주석을 해제하십시오. "No such module"오류가 사라졌습니다.


이렇게해도 다른 사람의 문제가 해결되지 않으면 다음을 시도해보십시오.

빌드 폴더 정리

제품 메뉴를 열고을 누른 상태 Option에서 "빌드 폴더 정리 ..."를 클릭하십시오.

여기에 이미지 설명을 입력하십시오

테스트 가능성 사용이 예로 설정되어 있는지 확인하십시오.

프로젝트 네비게이터에서 프로젝트 이름을 클릭하십시오. 빌드 설정을 선택하고 아래로 스크롤하여 빌드 옵션으로 이동하십시오. 테스트 가능성 사용이 예 (디버그 용)인지 확인하십시오.

여기에 이미지 설명을 입력하십시오

테스트 대상 삭제 및 다시 추가

다른 일을 한 경우 내 추측은 아마도 이것을 할 필요가 없다는 것입니다. 그러나 그렇게하면 이미 작성한 단위 테스트를 저장하십시오.

프로젝트 네비게이터에서 프로젝트 이름을 클릭하십시오. 그런 다음 테스트 대상을 선택하십시오. 아래쪽에서 빼기 (-) 단추를 클릭하여 삭제하십시오.

여기에 이미지 설명을 입력하십시오

그런 다음 더하기 (+) 버튼을 클릭하고 iOS 단위 테스트 번들을 선택하여 다시 추가하십시오. 보시다시피 동일한 방법으로 UI 테스팅 번들을 추가 할 수도 있습니다.

다른 아이디어들

  • 모든 필수 클래스가 테스트 대상의 구성원인지 확인하십시오.
  • 필요한 모든 라이브러리를 추가했는지 확인하십시오.
  • 모듈 이름이 올바르게 작성되었는지 확인하십시오 ( 이 답변 참조 ).

또는...

효과가있는 다른 것을 찾으면 아래에 의견이나 답을 남겨주세요

관련


2
Xcode 7 베타 5에서 모두 동일한 문제가 발생합니다. 불행히도 위의 단계로 문제를 해결하지 못하는 것 같습니다. 모듈은 여전히 ​​"이러한 모듈 '유틸리티'가 아닙니다"로 간주됩니다. 스크린 샷과의 유일한 차이점은 UI 테스트 폴더 (내 경우에는 GlimpulseUITests)를 사용하려고한다는 것입니다. @testable이 UI 테스트 대상에서 작동하지 않습니까?
Zac

5
*** 중요 *** 테스트 대상을 삭제했다가 다시 추가하면 기존 테스트를 덮어 쓰는 빈 테스트 템플릿이 다시 생성됩니다. 이 작업을 수행하기 전에 테스트 소스를 저장하십시오.
pauln

2
나를 위해 입력하는 동안 내 개별 클래스조차도 표시되지 않았습니다 ... 마침내 제품> 정리를 시작하고 XCode를 다시 시작했습니다. 다시 시작하면 색인 작성을 완료하는 데 몇 초가 걸리고 각 클래스를 테스트 대상의 멤버로 포함하지 않고 모든 참조가 표시되었습니다.
Rajive Jain

1
또한 시도하지 않은 경우 왼쪽에서 누락 된 프레임 워크를 클릭 한 다음 오른쪽에서 "대상 구성원"을 선택하고 단위 테스트 대상에 포함하십시오.
albogdano

3
기본 대상-> "제품 모듈 이름"의 빌드 설정으로 이동하여 테스트에서 가져 오려는 모듈 이름과 일치하는지 확인하십시오.
f0rz

64

문제는 테스트의 iOS 배포 대상이 기본 대상과 동일하게 설정되지 않았다는 것입니다. 따라서 이것을 확인하십시오.

테스트 대상에서 :

Build Settings -> iOS Deployment Target -> iOS<same as the target you are testing>

그 후에 테스트 번들 을 설정 Enable Bitcode해야 No했습니다.
pableiros

2
그것은 작동하지만 xcode에서 다른 오류를 발생시키지 않는 얼마나 어리석은가
J. Doe

31

그래서 이것은 이전 제안에서 제안 된 모든 솔루션을 시도한 후 코드가 작동하도록하는 방법입니다.

  • 프로젝트의 빌드 설정에서 '테스트 기능 사용'을 '예'로 설정했습니다.
  • 또한 프로젝트의 빌드 설정에서 '모듈 정의'를 '예'로 설정했습니다.
  • 내 프로젝트 내에서 일반 .swift 파일 (들)의 경우, 말 의 MyApp을 나는에 대한 쓰기 테스트 케이스로 가고 있었다, 나는이 주 " MyApp를 "과 " MyAppUnitTests "대상은 아래에서 확인 대상 회원 .
  • 그런 다음 단위 테스트 파일을 선택 하고 상단의 ' import XCTest ' 아래에서 ' @testable import MyApp '을 선언하고 대상 멤버쉽 에서 "MyAppUnitTests" 확인했습니다.

그리고 모든 것이 매력처럼 작동했습니다. 도움이 되었기를 바랍니다.


8
테스트 가능 및 모듈 정의가 트릭을 수행 한 것입니다. 일반 * .swift 파일의 대상 멤버십을 변경할 필요가 없었습니다.
George Yacoub

위의 모든 단계를 수행했지만 여전히 모듈 오류가 없습니다. 내 프로젝트는 빠른 목표 c 믹스입니다
Mikael

@Mikael, Objc / Swift 혼합 코드베이스에서 Swift 파일에 대해서만 테스트를 작성하고 있습니까? (마지막으로 확인했을 때 '@testable import'는 Obj-c / Swift 코드베이스 혼합물에서도 Swift 파일에 대해서만 테스트 사례를 작성하는 데 효과가 있다고 생각합니다. 아마도 지금까지 변경되었을 수 있습니다. 내가 틀렸다면).
빅 스위프트

6
내 문제를 찾았습니다. 테스트 대상의 유효 아키텍처가 기본 목표의 유효 아키텍처 구성과 같지 않았기 때문입니다. 이제 작동합니다. Btw, 나는 내 경우에 스위프트 클래스 만 테스트하고, Obj-c에 대한 시험을주지 않았다
Mikael

3
응용 프로그램 빠른 파일을 테스트 대상에 추가하면 안되며 테스트를 실행할 때 내용이 복제됩니다.
Przemysław Wrzesiński

18

주의해야 할 점은 모듈 이름에 대시 문자가 있으면 -대신 밑줄로 참조해야한다는 것 _입니다. 어떤 이유로 나는 이것이 문제 일 것으로 의심되었고 실제로 내 문제였습니다.

예. @testable import Ocean-Swift된다@testable import Ocean_Swift

@testable구문을 사용하는 경우 테스트 대상에 프로덕션 코드를 포함시키지 마십시오. 나는 이것이 불가사의 한 이상을 초래할 것이라는 것을 알았다.


1
영숫자가 아닌 모든 문자는 밑줄로 바꿔야 할 수도 있습니다. 내 목표는이 형식이었습니다 App (Dev). 테스트 가능한 모듈은 다음과 같습니다.App__Dev_
mushcraft

11

두 대상의 빌드 설정에 오류가있는 것 같습니다. 다음을 확인해야합니다.

  • ENABLE_TESTABILITY 두 대상 모두에 대해 예입니다.
  • PRODUCT_MODULE_NAME테스트 대상 의 값은 응용 프로그램 의 값과 달라야합니다.

2
이것은 나를 위해 일했습니다. 잘못된 모듈 이름을 사용하고있었습니다. _를 추가하는 대신 공백을 제거하고있었습니다. 구성 설정에서 제품 모듈 이름을 두 번 확인
MoralCode

9

확인해야 할 또 다른 사항 : Objective-C 프로젝트가 있지만 Swift에서 단위 테스트를 작성하는 경우 주 대상이 하나 이상의 Swift 파일을 사용해야합니다!


더 많은 정보:

Objective-C 프로젝트를 진행하고 있었지만 Swift에서 단위 테스트를 작성하고 싶었습니다.

필요한 ProjectName-Bridging-Header.h 파일을 생성하기 위해 Swift 파일을 기본 대상에 추가하고 테스트를 작성했으며 모든 것이 제대로 작동했습니다.

나중에 Swift 파일이 필요 없다고 생각했기 때문에 Swift 파일을 삭제했습니다 (모든 주요 대상 코드는 Objective-C에 있습니다 ... Swift에서만 테스트를 작성했습니다).

"clean / clean build folder"를 수행 한 후 "No Such Module"문제가 나타난 후 나중에 문제가 발견되지 않았습니다. 머리를 긁은 후 새로운 빈 Swift 파일을 추가했는데 문제가 해결되었습니다.

나는 Swift 파일을 사용하거나 사용하지 않고 여러 번 테스트했으며 그 파일 만 작동합니다 ... 그래서 프로젝트에 빈 파일을 남겨 두거나 Objective-C를 Swift로 변환하거나 일부를 추가해야합니다 Swift로 작성된 프로젝트에 새로운 코드.


1
!! 3 시간 후 청소 삭제 된 데이터 삭제, 청소, 처음부터 3 번 시작, 내 문제를 해결 한 의견을 찾았습니다 !!! 감사 !!!!
Maryam Fekri

Swift 테스트 클래스에서 Objective-C 클래스에 액세스하는 방법을 알고 프로젝트 모듈을 가져 오면 오류가 없지만 여전히 Objective-C 클래스를 인식하지 못합니다. 다른 일을해야합니까?
Maryam Fekri

ObjC 프로젝트에는 적어도 하나의 스위프트 파일이 있지만 대상에 대한 브리징 헤더가 없었지만 추가하고 싶은 점이 하나 더 있습니다. "앱 대상 내에서 코드 가져 오기"라는 제목 아래 다음 링크의 지침에 따라 Swift 테스트에서 ObjC 클래스에 액세스 할 수있는 문제가 해결되었습니다. developer.apple.com/documentation/swift/…
palmi

나는이 문제에 부딪쳤다. 그러나 가능한 경우 스위프트 파일을 포함하지 않는 방법을 찾는 데 관심이 있으므로 여기에 질문했습니다. stackoverflow.com/q/62965954/211292
ThomasW

실제로 @testable import Foo라인을 포함하지 않으면 단위 테스트가 올바르게 실행되는 것 같습니다.
ThomasW

9

마지막 답변까지 스크롤했지만 여전히 아무 효과가없는 사람들을 위해 다른 모든 답변 조언을 따른 후에 나에게 무엇을 했습니까? Xcode 11을 사용하고 있습니다.

필자의 경우 문제의 원인은 제품 이름을 변경 한 것이 었습니다

  1. 내 변경 제품 이름 에 내 주요 대상의 빌드 설정에서 "새 이름"
  2. 테스트 대상으로 호스트 응용 프로그램 을 다시 선택해야했습니다
  3. 제품 이름을 변경하면 제품 모듈 이름 도 변경되므로 테스트 파일에서 모듈을 가져 오는 데 사용됩니다. 다음과 같이 가져 오기를 변경했습니다.

    @testable import New_Name

  4. 그것은 효과가 있었다

나는 그것이 도움이되기를 바랍니다


7

이 문제에 며칠을 보낸 후 마침내 프로젝트와 함께 작동하게되었습니다. 브리징 헤더에 문제가 있음-기본 대상에서 브리징 헤더를 사용하는 경우 테스트 대상의 경로를 비울 수 없습니다브리징 헤더는 비워 둘 수 없습니다 !!!

누군가를 위해 시간을 절약 할 수 있기를 바랍니다.


5

테스트 체계의 빌드 설정에서 테스트 대상이 목록에 있는지 확인하십시오.

재생 버튼 옆에서 테스트 구성표를 선택한 다음 구성표 편집 ...을 선택하고 빌드 섹션으로 이동 한 다음 더하기 +를 클릭하고 테스트 할 대상을 선택하십시오.

필자의 경우 개발할 내부 대상이 있지만 (약간의 약간의 차이) 병합 후 테스트 구성에서 제거되었습니다.

테스트 체계 편집


5

여기에 나열되지 않은 또 다른 확인 사항이 있습니다. 저의 팀 에이전트가 아직 최신 라이센스 계약에 동의하지 않았기 때문에 팀과 관련이있었습니다. 대상의 일반 설정에서 다른 팀을 선택한 다음 12.1 또는 11.0과 같은 특정 배포 대상을 지정하면 갑자기 "No such Module"경고가 사라졌습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오


4

제 경우에는 3 가지 문제가있었습니다. 첫 번째는 가져 오기 경로를 지정해야한다는 것입니다.

Target -> Build Settings -> Swift Compiler - Search Paths -> Import Paths

두 번째는 포드를 사용하고 있었고이 포드를 내 테스트로 가져와야한다는 것입니다.

target 'MyAppTests' do
    inherit! :complete
end

세 번째는 대상에서 브리징 헤더를 사용하고 있었으므로 브리징 헤더를 테스트와 동일하게 지정해야했습니다.


2

내 문제는 내가 테스트하려는 클래스가 별도의 모듈 (API 클라이언트)에 있어야한다고 가정했지만 클래스는 실제로 프레임 워크 대상이 아닌 앱 대상의 멤버였습니다. 클래스의 대상 멤버십을 변경하면 가져 오기 오류가 사라졌습니다!


2

환경 : Xcode 버전 9.0 (9A235)
시나리오 : 공개 소스 프레임 워크 테스트.

나는 같은 문제가 있었다 : 'No such module'.

해결책:

  1. 테스트 대상을 선택하십시오.
  2. 빌드 단계 선택
  3. Link Binary를 통해 테스트 할 프레임 워크 추가 ...

여기에 이미지 설명을 입력하십시오

테스트 파일은 다음과 같습니다. 여기에 이미지 설명을 입력하십시오


2

나는이 같은 문제가 있었다. 빌드 폴더를 정리하고 Xcode를 다시 시작하지 못했습니다.

나를 위해 일한 것은 테스트 대상 및 구성표의 "Build Active Architecture Only"설정이 앱 대상 및 구성표 설정과 일치하는지 확인하는 것이 었습니다.


2

나는 위의 단계를 따라갔습니다. 그러나 내 프로젝트에는 더 많은 문제가 있습니다. 이 경고가 표시되어 테스트 대상에서 테스트하기 위해 기본 프로젝트의 클래스에 액세스 할 수 없습니다.

가져 오기를 무시하고 모듈의 일부를 테스트합니다.

테스트 대상 제품 모듈 이름 (YourTestTarget-> 빌드 설정-> 검색 product module)이 프로젝트 이름과 같을 수 없음을 발견했습니다.

테스트 대상의 제품 모듈 이름은 프로젝트 이름과 같을 수 없습니다.

테스트 대상의 제품 모듈 이름을 변경하면 모든 것이 작동했습니다.

여기에 이미지 설명을 입력하십시오


1

나는 모든 대답을 시도했지만 붉은 깃발은 사라지지 않을 것입니다. 그러나 나는 빈 테스트를 "실행"하는 것과 상관없이 작동하도록하고 그것을 정리했습니다.

내가 확인하고 싶은 것들 :

  • 호스트 신청
  • @testable import "Module_name"(모듈 이름이 올바른지 확인하십시오)
  • 테스트 대상 배포가 프로젝트와 동일한 지 확인하십시오.
  • XCTest는 Target 멤버십이 필요하지 않습니다

0

나를 위해 해결책은 빌드 설정 / 포장 / 제품 이름 /에서 대상 myproject-ios의 제품 이름을 $ {TARGET_NAME}에서 myproject로 업데이트 한 후 @testable import myproject_ios를 @testable import myproject로 이름을 바꾸는 것이 었습니다.


0

배포 대상 을 9.3에서 11.0으로 변경했을 때 수정되었습니다 .

일반> 배포 대상> "11.0"


이 더 시뮬레이터를 변경하는 경우가 될 수 있지만,이 또한 나를 위해 일했다
RolandasR

0

내 해결책은 여기에 있습니다.

먼저 OdeAlSwiftUITest.swift를 클릭 한 다음 대상 멤버십에서 Project TargetName을 확인하십시오.

여기에 이미지 설명을 입력하십시오


8
이것은 잘못이다. 테스트 파일을 대상에 추가하지 마십시오.
smileBot

0

xcodebuild를 사용하고 있고이 문제점을 발견 한 경우, build 명령에 작업 공간 플래그를 추가하십시오.

이 변경

$ xcodebuild -scheme PowToonsTests -destination 'name=iPhone X' test

이에

$ xcodebuild -workspace PowToons.xcworkspace -scheme PowToonsTests -destination 'name=iPhone X' test

0

빌드 설정 테스트 대상에서 호스트 테스트를 확인하십시오. PRODUCT_NAME에 설정된 이름을 사용합니다. 테스트 클래스에서 사용해야하는 이름입니다.

PRODUCT_NAME (기본 대상의 일치 이름)을 변경하지 말 것을 권장합니다


0

여기에 이미지 설명을 입력하십시오

프로젝트 탐색기에서 MyAppTests.swift를 클릭하고 오른쪽 패널을 클릭하고 대상 멤버십에서 모듈을 확인하십시오. 그것은 내에서 작동합니다.


응용 프로그램 대상에 테스트 클래스를 추가해서는 안됩니다.
Alex Motor


-1

이 답변 에서 설명한 것처럼 Obj-C 전용 프로젝트에 Swift 테스트를 추가했습니다. 해결책은 더미 Swift 클래스를 추가하는 것이었고 그 후에 Xcode는 브리징 헤더를 추가하라는 메시지를 표시 한 다음 Swift 클래스를 제거하라는 메시지를 표시했습니다. 그 후 모두 괜찮 았습니다.


-1

나열된 다른 것 외에도 단위 테스트 모듈의 컴파일 소스에 테스트하려는 클래스가있는 파일을 추가해야했습니다.여기에 이미지 설명을 입력하십시오


-1

예제 테스트를 삭제했기 때문에 이것이 발생했을 수 있습니다.

Unit 테스트 번들을 제거한 다음 아래 그림과 같이 다시 추가했는데 모두 다시 정상적으로 작동했습니다.

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

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