programing

Xcode Unit 테스트에서 @testable을 사용하는 경우 "해당 모듈 없음"

jooyons 2023. 5. 5. 09:38
반응형

Xcode Unit 테스트에서 @testable을 사용하는 경우 "해당 모듈 없음"

저는 최근에 Xcode 7 베타 5로 업데이트했습니다.프로젝트에 "module [ "No such module [myModuleName]" 메시지가 .@testable import myModuleName선을

여기에 이미지 설명 입력

나는 노력했다.

  • 빌드 폴더 정리를 사용하여 프로젝트 정리
  • 빌드 옵션에서 "테스트 가능성 활성화"(디버그)가 예로 설정되었는지 확인
  • 테스트 대상 삭제 후 iOS Unit 테스트 번들 다시 추가

이 프로젝트에서는 이 중 어느 것도 작동하지 않았습니다(그러나 저는 다른 프로젝트에서 작업하기 위해 테스트를 받았습니다)이 문제를 해결한 사람이 또 있습니까?

을 가오려이확인으로 하십시오.@testable import "ModuleName"은 모듈이다같합니다에서 .Target->Build Settings-> Product Module Name

나에게 효과가 있었던 답은

그 대답은 제 프로젝트에 오류가 있어서 빌드가 실패했다는 것이었습니다.(코드에 있는 매일 버그의 기준일 뿐입니다.)제가 오류를 수정하고 또 다른 청소와 빌드를 한 후에러가 발생했습니다.

이러한 오류는 처음에는 나타나지 않았습니다.그들이 나타나도록 하는 것:

  • 해당 모듈 없음 오류가 발생하는 전체 테스트 파일에 대해 설명합니다.
  • 프로젝트를 다시 실행해 보십시오.

다른 오류가 있으면 지금 나타나야 합니다.수정한 다음 테스트 파일 코드의 주석을 제거합니다."No this module" 오류가 사라졌습니다.


이렇게 해도 다른 사용자가 문제를 해결할 수 없는 경우 다음을 시도할 수도 있습니다.

빌드 폴더 정리

제품 메뉴를 열고 누른 상태에서 "빌드 폴더 정리..."를 클릭합니다.."

여기에 이미지 설명 입력

테스트 가능성 사용이 예로 설정되어 있는지 확인합니다.

프로젝트 탐색기에서 프로젝트 이름을 클릭합니다.빌드 설정을 선택하고 아래로 스크롤하여 빌드 옵션을 선택합니다.테스트 가능성 사용이 예(디버깅용)인지 확인합니다.

여기에 이미지 설명 입력

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

다른 작업을 수행했다면 이 작업을 수행할 필요가 없을 것입니다.그러나 이미 작성한 장치 테스트를 저장해야 합니다.

프로젝트 탐색기에서 프로젝트 이름을 클릭합니다.그런 다음 테스트 대상을 선택합니다.하단의 빼기(-) 버튼을 클릭하여 삭제합니다.

여기에 이미지 설명 입력

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

몇 가지 다른 아이디어

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

아니면...

효과가 있는 다른 것을 발견한 경우 아래에 의견이나 답변을 남겨 주십시오.

관련된

저에게 문제는 테스트의 iOS 배포 대상이 메인 대상과 동일하게 설정되지 않았다는 것입니다.그러니 이것을 꼭 확인하세요.

테스트 대상:

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

그래서 저는 이전 제안들에서 제안된 모든 해결책을 시도한 후 코드를 작동시키기 위해 이렇게 했습니다.

  • 프로젝트의 빌드 설정에서 '테스트 가능성 활성화'를 '예'로 설정했습니다.
  • 또한 프로젝트의 빌드 설정에서 'Defines Module'을 'YES'로 설정합니다.
  • 프로젝트에 포함된 일반 .swift 파일(: MyApp)의 경우 테스트 사례를 작성하려고 했습니다. 기본 "MyApp" "MyAppUnitTests" 대상을 모두 Target Membership에서 확인했습니다.
  • 그런 다음 유닛 테스트 파일을 선택하고 'import XCTest' 아래의 맨 위에 '@testable import MyApp'을 선언하고 Target membership 아래에 있는 "MyAppUnitTests"만 확인했습니다.

그리고 모든 것이 매력적으로 작동했습니다.이게 도움이 되길 바랍니다.

가지 할 점은 에 대시 입니다.-그러면 당신은 대신 언더바로 그것을 참조해야 할 것입니다._어떤 이유에서인지 저는 이것이 문제가 될 수 있다고 생각했고 그것은 사실 저의 문제였습니다.

예를 들면@testable import Ocean-Swift 되다@testable import Ocean_Swift

한 가지 더, 만약 당신이 그것을 사용한다면.@testable구문은 테스트 대상에 생산 코드를 포함하지 않아야 합니다.나는 이것이 설명할 수 없는 이상함을 야기할 것이라는 것을 발견했습니다.

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

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

마지막 답변까지 스크롤을 했지만 여전히 아무 것도 작동하지 않는 사람들을 위해, 여기 다른 모든 답변 조언을 따른 후에 저에게 무엇을 해 주었는가가 있습니다.나는 Xcode 11을 사용하고 있습니다.

제 경우 문제의 원인은 제품 이름을 변경했기 때문입니다.

  1. 기본 대상의 빌드 설정에서 제품 이름을 "새 이름"으로 변경했습니다.
  2. 테스트 대상에 대해 호스트 애플리케이션을 다시 선택해야 했습니다.
  3. 제품 이름을 변경하면 테스트 파일의 모듈 가져오기에 사용되는 제품 모듈 이름도 변경될 줄은 몰랐습니다.다음과 같이 가져오기를 변경했습니다.

    @testable 가져오기New_Name

  4. 효과가 있었습니다

도움이 되길 바랍니다.

이 문제에 대해 며칠을 보낸 후에 저는 마침내 프로젝트를 진행할 수 있게 되었습니다.Bridging Header에 문제가 있습니다. 기본브리징 헤더는 비워둘 수 없습니다!!! 대상에서 Bridging Header를 사용하는 경우 테스트 대상의 경로를 비워 둘 수 없습니다.

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

한 가지 더 확인해야 할 사항:목표-C 프로젝트가 있지만 Swift에서 단위 테스트를 작성 중인 경우, 주 대상이 적어도 하나의 Swift 파일을 사용하는지 확인하십시오!


추가 정보:

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

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

나중에 Swift 파일이 필요하지 않다고 생각하여 삭제했습니다(주 타겟의 코드는 모두 Objective-C...).저는 단지 Swift로 시험을 작성했을 뿐입니다.)

나중에 "빌드 폴더 정리/정리"를 수행하고 "해당 모듈 없음" 문제가 표시된 후에야 문제를 발견했습니다.머리를 긁힌 후에 저는 새로운 빈 Swift 파일을 추가했고 문제는 사라졌습니다.

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

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

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

두 번째는 포드를 사용하고 있었기 때문에 다음을 사용하여 테스트에 이 포드를 가져와야 했습니다.

target 'MyAppTests' do
    inherit! :complete
end

세 번째는 대상에서 브리징 헤더를 사용했기 때문에 테스트에서 브리징 헤더를 동일하게 지정해야 했습니다.

테스트 구성표의 빌드 설정 아래에 테스트 대상이 목록에 있는지 확인합니다.

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

저의 경우, 우리가 개발한 내부 대상이 있으며(몇 가지 사소한 차이점) 병합 후 테스트 구성에서 제거되었습니다.

테스트 구성표 편집

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

여기에 이미지 설명 입력

여기에 이미지 설명 입력

프로젝트에 일부 대상이 있는 경우 - @testable 가져오기 "TARGETSModuleName"을 사용하여 가져오려는 모듈 이름에서 대상을 확인합니다.

모듈 이름은 대상 -> 빌드 설정 -> 제품 모듈 이름에서 동일해야 합니다.

예:

테스트 대상 모듈 이름

저는 위의 단계를 따랐고, 그것은 효과가 있었습니다.하지만, 제 프로젝트는 몇 가지 문제가 더 있었습니다.저는 이 경고를 받았고 시험 대상에서 테스트하기 위해 메인 프로젝트의 수업에 액세스할 수 없었습니다.

모듈의 일부 테스트 - 가져오기 무시

이름-> Settings -> 검색)을.product module 이름과 일 수 는 프로젝트 이름과 동일한 이름일 수 없습니다.

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

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

여기에 이미지 설명 입력

저는 여기서 모든 답을 시도했지만 빨간 깃발이 사라지지 않았습니다.하지만 저는 빈 테스트를 "실행"함으로써 그것이 작동하도록 했고 그것은 깨끗해졌습니다.

다음과 같은 작업이 수행할 작업:

  • 호스트 응용 프로그램
  • @testable 가져오기 "Module_name"(모듈 이름이 올바른지 확인)
  • 테스트의 배포 대상이 프로젝트와 동일한지 확인합니다.
  • XCTest는 Target 멤버 자격이 필요하지 않습니다.

XCode 12.6 베타

이 문제의 원인이 무엇인지는 모르겠지만 빌드 폴더를 정리해도 정렬되지 않았습니다.XCode를 다시 시작해도 문제가 해결되지 않았습니다.

게 효과가 은 이입니다: 제게효있것이것삭입다니한제줄을은었과던가:▁what.import XCTest다시 입력합니다.

제 문제는 제가 테스트하고자 하는 클래스가 별도의 모듈(API Client)에 있어야 하는데, 실제로 해당 클래스는 프레임워크 대상이 아닌 앱 대상의 멤버라는 것입니다.클래스의 대상 멤버 자격을 변경하면 가져오기 오류가 사라집니다!

환경: Xcode 버전 9.0(9A235)
시나리오:오픈 소스 프레임워크를 테스트합니다.

저도 같은 문제가 있었습니다. '그런 모듈은 없습니다.'

솔루션:

  1. 테스트 대상을 선택합니다.
  2. 빌드 단계 선택
  3. 링크 이진을 통해 테스트할 프레임워크 추가...

여기에 이미지 설명 입력

테스트 파일은 다음과 같습니다.

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

테스트 대상 및 구성표의 "활성 아키텍처 구축 전용" 설정이 앱의 대상 및 구성표 설정과 일치하는지 확인하는 것이 효과적이었습니다.

XCode 12 개발 베타 3

제가 프로젝트를 처음으로 구축한 후 오류가 해결되었습니다.

Xcode 13.1에서는 다음과 같이 작동했습니다.

Xcode 기본 설정 > 위치 탭에서 사용자 지정 위치를 정의했습니다.

여기에 이미지 설명 입력

이로 인해 장치 테스트가 "No such module" 오류로 실패했을 뿐만 아니라 "Command Code Sign failed with non-zero exit code" 및 기타 경고와 오류가 발생했습니다.

설정을 고유으로 변경:

여기에 이미지 설명 입력

모든 문제를 해결했습니다.

다음과 같은 경우도 있습니다.

  • 테스트 대상에 대한 호스팅 응용 프로그램을 설정하지 않음(일반 탭 또는TEST_HOST빌드 설정)
  • 테스트 대상에 대한 빌드 단계의 앱 종속성이 없습니다.

빌드 설정/패키지화/제품 이름/에서 대상 myproject-ios의 제품명을 ${TARGET_NAME}에서 ${TARGET_NAME}에서 프로젝트로 업데이트한 후 @testableimport myproject_ios의 이름을 @testableimport myproject_ios로 변경하는 것이 해결책이었습니다.

문제는 배포 대상을 9.3에서 11.0으로 변경했을 때 해결되었습니다.

일반 > 배포 대상 > "11.0"

xcodebuild를 사용하는 경우 이 문제가 발견되면 build 명령에 워크스페이스 플래그를 추가하는 것이 좋습니다.

변경 내용

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

수신처

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

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

PRODUCT_NAME(주 대상의 일치 이름)은 변경하지 않는 것이 좋습니다.

제가 예제 테스트를 삭제했기 때문에 이런 일이 발생했을 수도 생각합니다.

유닛 테스트 번들을 제거하고 아래 사진과 같이 다시 추가했더니 다시 정상입니다.

여기에 이미지 설명 입력

여기에 이미지 설명 입력

코코아 포드는 다음을 추가할 것을(를 권장합니다.inherit! :search_paths테스트 대상에 대해 다음과 같이 설명합니다.

target 'App' do
  target 'AppTests' do
    inherit! :search_paths
  end
end

출처: https://github.com/CocoaPods/CocoaPods/pull/8423#issue-244992565

모든 해결책을 시도했습니다.아무 것도 효과가 없었습니다.swift 패키지 모듈에서 Xcode 빌드 CLI를 찾을 수 없습니다. 오류가 발생했습니다.

오류: 해당 모듈 'Apollo'가 Apollo를 가져오지 않습니다.

테스트 대상을 제거하고 다시 추가하는 것이 저에게 도움이 되었습니다.

앱 스토어에 원래 이름이 표시되지 않도록 프로젝트 이름을 변경했습니다.이것은 제 앱 호스트를 변경해야 했고, 이로 인해 제가 만든 가져오기를 변경해야 했습니다.

이전 이름:QRCodeTarot

이름:Pointy Hat Tarot

버전 제어 클라이언트에서 호스트에 대해 변경한 내용입니다.

여기에 이미지 설명 입력

이는 테스트에서 가져오기 이름을 앱의 표시 이름으로 변경해야 한다는 것을 의미합니다.그래서 제 프로젝트의 이름이 QRodeTarot임에도 불구하고 Import를 표시 이름으로 변경해야 했습니다.

는 그서저는에서 갔습니다.import QRCodeReaderimport Pointy_Hat_Tarot.

프로젝트 이름을 테스트 가져오기 이름과 일치시키는 권장 사항이 잘못되었습니다.

가져오기 이름은 프로젝트 이름이 아니라 프로젝트의 표시 이름과 일치해야 합니다.

언급URL : https://stackoverflow.com/questions/32008403/no-such-module-when-using-testable-in-xcode-unit-tests

반응형