내 프로젝트에 대해 단위 테스트를 설정하려고합니다. 최근에 하나의 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이 좋은 솔루션을 제공하기를 바랍니다. 위의 솔루션을 사용해야한다고 생각할 때까지.
답변
이것을 알아 낸 @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.h
에Bar.m
, 그리고 모든 일 – 목표 – C의 내 테스트가 제대로 컴파일 오브젝티브 C로 작성과 실행을 계속하고, 스위프트가 스위프트의 객체에 대해 내가 새로운 테스트를 작성할 수 객체.
도움이 되었기를 바랍니다!
답변
나는 모든 것을 시도 후 나는 주제에 찾을 수있는 나를 위해 일한 것은 한 여전히 오류를 ‘을 (를) 찾을 수 없습니다 모듈 이름 Swift.h 파일을’보여주는되었지만 실제로 응용 프로그램을 실행할 수 있습니다.
사라지고 내 앱이 완벽하게 작동합니다. 아까 생각 했어야했는데 … 오류가 계속 발생 하지만 앱을 실행 한 후에는 항상 다시 사라집니다. 따라서 문제가 실제로 해결되지는 않았지만 지금은 다른 주제로 계속 작업 할 수 있습니다.
답변
간단한
@testable import MyProject
나를 위해 일했습니다.
답변
이상하게도 동일한 오류가 발생했지만 시뮬레이터가 아닌 장치를 대상으로 할 때만 발생했습니다. 테스트를 실행하기 전에 “MyProjectNameTests-Swift.h”에 대한 import 문 옆에 빨간색 느낌표가 표시됩니다.
그러나 재미있는 점은 (이 명백한 빌드 오류에도 불구하고) 어쨌든 테스트를 실행하면 그 이후에 발생하는 빌드 단계에서 XCode가 실제로 “MyProjectNameTests-Swift.h”파일을 생성하고 테스트를 수행한다는 것입니다. 잘 실행됩니다!
그래서 적어도 제 경우에는 분명히 다른 솔루션이 필요하지 않았습니다.
이 전에 DerivedData 디렉토리를 삭제 했으므로 시도해 볼 가치가있는 단계 일 수도 있습니다.
