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


94

내 프로젝트에 대해 단위 테스트를 설정하려고합니다. 최근에 하나의 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

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


1
이에 대한 업데이트를 추가 하시겠습니까? 저도 같은 문제에 직면하고있어 ...
hyouuu

1
@Coveloper- '-Swift.h'파일의 대상을 어떻게 설정할 수 있습니까? 프로젝트에있는 실제 파일이 아니라 빌드시 Xcode에 의해 컴파일됩니다.
JimmyJammed

1
위의 " 'MyProject-Swift.h'파일을 찾을 수 없음 오류가 발생했습니다 .."주석에 대한 업데이트는 다음과 같습니다. MyProjectTests가 아닌 MyProjectTests 대상의 제품 모듈 이름을 MyProject로 설정하여 해결 방법을 찾았습니다. 따라서 이제 두 대상 (MyProject 및 MyProjectTests)이 동일한 제품 모듈 이름을 갖습니다. 이상하지만 테스트 대상이므로 작동하고 위험이 적습니다. 나는 내 프로젝트 따라서 My_Project 실제 모듈 이름처럼 내 프로젝트의 이름은 실제로 언급한다).
finneycanhelp

6
"MyProject-Swift.h"파일은 "$ (TARGET_TEMP_DIR) /../$ (PROJECT_NAME) .build / DerivedSources"에 생성됩니다. 내 단위 테스트 대상에 대한 헤더 검색 경로에 이것을 추가합니다.
gagarwal

1
@gagarwal 단위 테스트 대상의 헤더 검색 경로에 "$ (TARGET_TEMP_DIR) /../$ (PROJECT_NAME) .build / DerivedSources"를 추가했습니다. :) 그 댓글에서 SO 답변을 작성하면 현상금을 지급하고 다른 사람에게 그것이 얼마나 훌륭한 답변인지 명확히 할 수 있습니다.
finneycanhelp 2015 년

답변:


148

"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


매력처럼 일했다!
DonnaLea 2015 년

대박! Apple이이 문제를 해결 방법으로 언급하지 않는 이유를 모릅니다. 또한이 문제를 겪고있는 사람들이 더 이상 없다는 사실에 놀랐습니다. 기존 Obj-C 프로젝트를 가지고있는 사람이라면 누구나 점차적으로 Swift로 전환 할 수 있습니다.
mluisbrown

@fabb true가 아닙니다. TARGET_NAME은 일반적으로 <Product Name> Tests테스트 대상 과 유사 합니다. 그러나 제품 이름에 공백이 있으면이 솔루션이 작동하지 않습니다. 해결책은 아래 내 대답을 참조하십시오 .
Christopher Pickslay

2
참고로 검색 경로를 추가하고 구체적으로 "재귀"로 설정해야했습니다. 당연한 것 같지만 내가 할 때까지 몇 번 작동하지 않았습니다. 그러면 하위 폴더로 이동한다고 가정합니다.
Miro 2017 년

1
내 프로젝트에서는 $(TARGET_TEMP_DIR)작동하지 않았습니다. 내가 사용하여 상처$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
요르단 Bondo에게

32

이것을 알아 낸 @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"

또한 단위 테스트 Core Data codegen 클래스의 문제를 해결합니다.
Elise van Looij

14

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의 해결 방법을 참조하십시오!


8

나는 당신과 비슷한 문제가 있다고 생각합니다. 여기 내 설정이 있습니다.

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로 작성과 실행을 계속하고, 스위프트가 스위프트의 객체에 대해 내가 새로운 테스트를 작성할 수 객체.

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


귀하의 솔루션은 Foo내부에서의 API 를 사용할 수 없습니다 Bar.m.
Yevhen Dubinin 2014

2
물론 그렇습니다- 파일에 포함 MyProject-Swift.h하면 .m얻을 수 있습니다.
dpassage

4

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

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


예, "찾을 수 없음"오류가 사라지는 해결책입니다.
Vijay Kumar Kanta

지금도 앱을 실행하는 동안 빌드가 실패합니다. 고쳐주세요, 애플!
ScottyB


0

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

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

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

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


-1

mySwiftClassTests(및 Objective-c에서 사용하려는 다른 빠른 클래스)는 다음과 같이 표시해야합니다 @objc.

@objc class MySwiftClassTests: XCTestCase

-1

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


-2

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

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