IOS - Файл MyProject-Swift.h не найден при запуске Unit Tests for Swift
Я пытаюсь настроить Unit Testing для моего проекта.
Это существующее приложение Objective-C, которое я недавно добавил в класс Swift. Я установил файлы MyProject-Swift.h и Swift Bridging (как "MyProject", так и "MyProjectTest" ), и я умею правильно создавать и запускать приложение, используя как Objective-C, так и код Swift.
Однако теперь я хочу запустить некоторые тесты Unit в новом классе 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
Файл MyProject-Swift.h " создается по следующему пути:
"$(TARGET_TEMP_DIR)/../$(PROJECT_NAME).build/DerivedSources"
Я в конечном итоге добавляю это в пути поиска заголовков для моей цели Unit Test.
Также, как @hyouuu отметил, что является известной проблемой, мы надеемся, что Apple предоставит некоторое хорошее решение в конце. Пока я не верю, что нам нужно использовать это решение.
https://developer.apple.com/library/content/documentation/Xcode/Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
Ответ 2
Спасибо @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"
Ответ 3
Увидел в заметке о выпуске Xcode 6.1, что это известная проблема... знак... Поиск "-swift.h" в заметке о выпуске https://developer.apple.com/library/content/documentation/Xcode/Концептуальный /RN-Xcode-архив/главы/xc6_release_notes.html
Тесты, написанные в Objective-C, не могут импортировать сгенерированный Swift заголовок интерфейсов ($ (PRODUCT_MODULE_NAME) -swift.h) для целей приложения и поэтому не могут использоваться для тестирования кода, который требует этот заголовок.
Тесты для кода Swift должны быть написаны на Swift. Тесты, написанные в Objective-C для целей платформы, могут получить доступ к сгенерированным интерфейсам Swift, импортировав модуль Framework с помощью @import FrameworkName ;. (16931027)
Пожалуйста, смотрите @gagarwal обходной путь, ниже которого работает!
Ответ 4
У меня была схожая проблема с твоей, я думаю; здесь была моя настройка.
У меня был объект, определенный в 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
не является реальным, а цель unit test не может его видеть. Замечание о выпуске, которое разделяет @hyouuu, находится в точке, но я не тестирую класс Swift, я тестирую класс Objective-C!
Я смог исправить это, изменив файл заголовка для Bar
вместо ссылки на следующий класс:
// file Bar.h
@class Foo;
@interface Bar: NSObject
- (instancetype)initWithFoo:(Foo *)foo;
@end
Затем я включил MyProject-Swift.h
в Bar.m
, и все сработало - мои тесты объектов Objective-C, написанные в Objective-C, были скомпилированы правильно и продолжались, и я мог писать новые тесты для объектов Swift в Swift.
Надеюсь, это поможет!
Ответ 5
После того, как я опробовал все, что мог найти на эту тему, то, что сработало для меня, было фактически запущено приложение, хотя оно все еще показывало файл ModuleName-Swift.h, а не найденной ".
Он ушел, и мое приложение работает отлично. Думаю, мне следовало бы подумать, что раньше... Ошибка продолжает возвращаться, но после запуска приложения она всегда просто исчезает снова. Поэтому проблема для меня не решена, но я могу продолжить работу над другими темами на данный момент...
Ответ 6
Странно, я видел ту же ошибку, но только при таргетинге на устройство (а не на симулятор). Перед запуском теста я увижу красный восклицательный знак рядом с оператором импорта для "MyProjectNameTests-Swift.h".
Однако, забавно, если я просто буду продолжать и запускать тест в любом случае (несмотря на эту очевидную ошибку сборки), то во время фазы сборки, которая происходит после этого, XCode фактически генерирует файл MyProjectNameTests-Swift.h, и тест проходит просто отлично!
Итак, по крайней мере, в моем случае, здесь не было необходимости в других решениях, хотя я считаю, что они тоже работают.
Я также должен отметить, что я удалил свой каталог DerivedData до этого, так что, возможно, это тоже стоит попробовать.
Ответ 7
Просто
@testable import MyProject
сделал работу для меня.
Ответ 8
mySwiftClassTests
(и любые другие быстрые классы, которые вы хотите использовать в objective-c), должны быть отмечены @objc
:
@objc class MySwiftClassTests: XCTestCase
Ответ 9
Я не мог заставить его работать, добавив этот путь к файлу, упомянутый другими ответами, но я понял, что файл, в котором он жаловался, даже не тестировался. Мне просто пришлось удалить его из тестовой цели, используя панель "Правая панель Утилиты".
Ответ 10
Добавление файла .swift к этой цели устраняет проблему.