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 к этой цели устраняет проблему.