programing

iOS - Swift용 Unit Tests 실행 시 'MyProject-Swift.h' 파일을 찾을 수 없습니다.

telecom 2023. 9. 2. 07:58
반응형

iOS - Swift용 Unit Tests 실행 시 'MyProject-Swift.h' 파일을 찾을 수 없습니다.

저는 제 프로젝트를 위해 유닛 테스트를 설정하려고 합니다.이것은 제가 최근에 스위프트 클래스 하나를 추가한 기존 Objective-C 앱입니다.'MyProject-Swift.h' 및 'SwiftBridging' 파일('MyProject' 및 'MyProject' 모두)을 설정했습니다.테스트')를 사용하면 Objective-C 코드와 Swift 코드를 모두 사용하여 앱을 구축하고 실행할 수 있습니다.

하지만 이제 새로운 Swift 클래스에서 Unit Tests를 실행하고 싶습니다.테스트 파일을 설정했는데 다음과 같습니다.

MySwiftClassTests.swift:

import UIKit
import XCTest
import MyProject

class MySwiftClassTests: XCTestCase {

    override func setUp() {
        super.setUp()
        // Put setup code here. This method is called before the invocation of each test method in the class.
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testExample() {
        // This is an example of a functional test case.
        XCTAssert(true, "Pass")
    }

    func testPerformanceExample() {
        // This is an example of a performance test case.
        self.measureBlock() {
            // Put the code you want to measure the time of here.
        }
    }

}

앱을 테스트로 실행할 때 다음 오류가 발생합니다.

'MyProject-Swift.h' file not found

테스트를 실행하려고 할 때만 이러한 현상이 발생하는 이유를 잘 모르겠습니다.좋은 의견이라도 있나?

"나의 프로젝트-Swift.h" 파일은 다음 경로에서 생성됩니다.

"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"

단위 테스트 대상의 헤더 검색 경로에 이 정보를 추가합니다.

또한 @hyouu가 알려진 문제에 대해 지적했듯이, 애플이 마지막에 좋은 해결책을 제공하기를 바랍니다.위의 해결책을 사용해야 한다고 생각할 때까지.

https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html

@gagarwal이 이 문제를 해결해 주셔서 감사합니다.우리의 경우 제품 이름에 공백이 있습니다. 이 공백은 다음과 같이 접힙니다.$PROJECT_NAME하드 코딩을 해야 했어요추가로, 사용함으로써$CONFIGURATION_TEMP_DIR$TARGET_TEMP_DIR 디렉터리 Directory")를 할 수 .../ 로부터. 경로로부터.따라서 다음을 테스트 대상의 헤더 검색 경로에 추가하는 것이 해결책입니다.

"$(CONFIGURATION_TEMP_DIR)/Product Name With Spaces.build/DerivedSources"

또는 제품에 공백이 없는 경우:

"$(CONFIGURATION_TEMP_DIR)/$(PROJECT_NAME).build/DerivedSources"

Xcode 6.1 릴리스 노트에서 이 문제가 알려진 문제임을 확인했습니다.사인..."-swift"를 검색합니다.h"는 릴리스 노트 https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html 에서 확인할 수 있습니다.

Objective-C로 작성된 테스트는 응용 프로그램 대상에 대해 Swift가 생성한 인터페이스 헤더($(PRODUCT_MODULE_NAME)-Swift.h)를 가져올 수 없으므로 이 헤더가 필요한 코드를 테스트하는 데 사용할 수 없습니다.

Swift 코드에 대한 테스트는 Swift로 작성되어야 합니다.프레임워크 대상에 대해 Objective-C로 작성된 테스트는 @import FrameworkName;을 사용하여 프레임워크 모듈을 가져와 Swift가 생성한 인터페이스에 액세스할 수 있습니다.(16931027)

아래에서 작동하는 @gagarwal의 해결 방법을 참조하십시오!

저도 당신과 비슷한 문제가 있었던 것 같습니다. 여기 제 설정이 있습니다.

Swift에 정의된 개체가 있습니다.

// file Foo.swift
@objc public class Foo {
    // ...
}

그런 다음 이 클래스는 Objective-C 개체의 이니셜라이저에 사용되었습니다.

// file Bar.h
#import "MyProject-Swift.h"

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

이것은 내 유닛 테스트를 만들었습니다.Bar 이일후 MyProject-Swift.h헤더가 실제가 아니며 장치 테스트 대상이 헤더를 볼 수 없습니다.@hyouuu가 공유한 릴리스 노트가 중요합니다. 하지만 저는 Swift 클래스를 테스트하는 것이 아니라 Objective-C 클래스를 테스트하고 있습니다!

헤더 파일을 변경하여 이 문제를 해결할 수 있었습니다.Bar대신 정방향 클래스 참조를 사용하려면:

// file Bar.h
@class Foo;

@interface Bar: NSObject

- (instancetype)initWithFoo:(Foo *)foo;

@end

그리고 나서 포함시켰습니다.MyProject-Swift.hBar.m그리고 모든 것이 작동했습니다. Objective-C로 작성된 Objective-C 개체에 대한 테스트가 제대로 컴파일되어 계속 실행되었으며 Swift에서 Swift 개체에 대한 새로운 테스트를 작성할 수 있었습니다.

이것이 도움이 되길 바랍니다!

제가 이 주제에 대해 찾을 수 있는 모든 것을 시도해 본 후, 여전히 'ModuleName-Swift.h 파일을 찾을없음' 오류가 표시되지만 실제로 앱을 실행하는 것게 효과적이었습니다.

그것은 사라졌고 내 앱은 완벽하게 잘 작동합니다.좀 더 일찍 고려했어야 했는데,오류가 계속 발생하지만 앱을 실행한 후에는 항상 다시 사라집니다.그래서 이 문제는 저에게 실제로 해결되지는 않았지만, 지금은 다른 주제로 계속 작업할 수 있습니다.

간단한

@testable import MyProject

날 위해 일을 해준 거지

이상하게도, 저는 이와 같은 오류를 보았지만, 장치(시뮬레이터가 아닌)를 대상으로 할 때만 발견했습니다.테스트를 실행하기 전에 "MyProjectNameTests-Swift"의 가져오기 문 옆에 빨간색 느낌표가 나타납니다.h."

하지만 재미있는 것은 (이 명백한 빌드 오류에도 불구하고) 테스트를 실행하면 이후에 발생하는 빌드 단계에서 XCode가 실제로 "MyProjectNameTests-Swift"를 생성한다는 것입니다.h" 파일, 그리고 테스트는 잘 실행됩니다!

그래서 적어도 저의 경우에는, 다른 해결책이 필요하지 않았습니다. 분명히, 저는 그것들이 효과가 있다고 믿지만요.

또한 이 전에 DerivedData 디렉토리를 삭제했기 때문에 이 단계도 시도해 볼 가치가 있습니다.

제 고객 중 한 명이 프로젝트에 직접 프레임워크를 추가했습니다.이런 식으로 오류를 해결했습니다.

  • 명령 1
  • 옵션 명령 J
  • 이제 필터에 (오류를 제공하는) 프레임워크 이름을 입력합니다.
  • 프레임워크를 선택합니다.
  • 옵션 명령 1
  • Target Membership에서 *UITests 대상을 선택합니다.

mySwiftClassTests(및 목표-c에서 사용할 다른 빠른 클래스)를 표시해야 합니다.@objc:

@objc class MySwiftClassTests: XCTestCase

다른 답변에서 언급한 파일 경로를 추가하여 작동시킬 수는 없었지만, 불만 사항이 있는 파일이 테스트되지도 않았다는 것을 깨달았습니다.오른쪽 유틸리티 사이드바를 사용하여 테스트 대상에서 제거해야 했습니다.

.swift 파일을 해당 대상에 추가하면 문제가 해결됩니다.

언급URL : https://stackoverflow.com/questions/26473058/ios-myproject-swift-h-file-not-found-when-running-unit-tests-for-swift

반응형