[ios] iOS-Swift 용 단위 테스트를 실행할 때 ‘MyProject-Swift.h’파일을 찾을 수 없음

내 프로젝트에 대해 단위 테스트를 설정하려고합니다. 최근에 하나의 Swift 클래스를 추가 한 기존 Objective-C 앱입니다. ‘MyProject-Swift.h’및 Swift Bridging 파일 ( ‘MyProject’및 ‘MyProjectTest’모두)을 설정했으며 Objective-C와 Swift 코드를 모두 사용하여 앱을 제대로 빌드하고 실행할 수 있습니다.

그러나 이제 새로운 Swift 클래스에서 일부 단위 테스트를 실행하고 싶습니다. 내 테스트 파일을 설정했는데 다음과 같이 보입니다.

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

왜 이것이 테스트를 실행하려고 할 때만 발생하는지 잘 모르겠습니다. 어떤 제안?



답변

“MyProject-Swift.h” 파일은 다음 경로에 생성됩니다.

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

내 단위 테스트 대상에 대한 헤더 검색 경로에 이것을 추가합니다.

또한 @hyouuu가 알려진 문제에 대해 지적했듯이 Apple이 좋은 솔루션을 제공하기를 바랍니다. 위의 솔루션을 사용해야한다고 생각할 때까지.

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상위 디렉터리 ( ../)를 제거 할 수 있습니다 . 따라서 해결책은 테스트 대상의 헤더 검색 경로에 다음을 추가하는 것입니다.

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

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

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


답변

Xcode 6.1 릴리스 노트에서 이것이 알려진 문제라는 것을 확인했습니다 … sign … 릴리스 노트 https://developer.apple.com/library/content/documentation/Xcode 에서 “-swift.h”를 검색합니다. /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 , 그리고 모든 일 – 목표 – C의 내 테스트가 제대로 컴파일 오브젝티브 C로 작성과 실행을 계속하고, 스위프트가 스위프트의 객체에 대해 내가 새로운 테스트를 작성할 수 객체.

도움이 되었기를 바랍니다!


답변

나는 모든 것을 시도 후 나는 주제에 찾을 수있는 나를 위해 일한 것은여전히 오류를 ‘을 (를) 찾을 수 없습니다 모듈 이름 Swift.h 파일을’보여주는되었지만 실제로 응용 프로그램을 실행할 수 있습니다.

사라지고 내 앱이 완벽하게 작동합니다. 아까 생각 했어야했는데 … 오류가 계속 발생 하지만 앱을 실행 한 후에는 항상 다시 사라집니다. 따라서 문제가 실제로 해결되지는 않았지만 지금은 다른 주제로 계속 작업 할 수 있습니다.


답변

간단한

@testable import MyProject

나를 위해 일했습니다.


답변

이상하게도 동일한 오류가 발생했지만 시뮬레이터가 아닌 장치를 대상으로 할 때만 발생했습니다. 테스트를 실행하기 전에 “MyProjectNameTests-Swift.h”에 대한 import 문 옆에 빨간색 느낌표가 표시됩니다.

그러나 재미있는 점은 (이 명백한 빌드 오류에도 불구하고) 어쨌든 테스트를 실행하면 그 이후에 발생하는 빌드 단계에서 XCode가 실제로 “MyProjectNameTests-Swift.h”파일을 생성하고 테스트를 수행한다는 것입니다. 잘 실행됩니다!

그래서 적어도 제 경우에는 분명히 다른 솔루션이 필요하지 않았습니다.

이 전에 DerivedData 디렉토리를 삭제 했으므로 시도해 볼 가치가있는 단계 일 수도 있습니다.