Я пытаюсь настроить модульное тестирование для своего проекта. Это существующее приложение Objective-C, в которое я недавно добавил один класс Swift. Я установил файлы 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.
}
}
}
Я получаю эту ошибку при запуске приложения как Test:
'MyProject-Swift.h' file not found
Я не уверен, почему это происходит только при попытке запустить тесты. Какие-либо предложения?
ios
unit-testing
swift
header
Джимми
источник
источник
Ответы:
Файл "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
источник
<Product Name> Tests
в вашей тестовой цели. Однако это решение не работает, если в названии вашего продукта есть пробелы. См. Мой ответ ниже для решения.$(TARGET_TEMP_DIR)
не сработало. Я закончил употребление$CONFIGURATION_TEMP_DIR/{myTargetName}.build/DerivedSources
Спасибо @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 видел, что это известная проблема ... знак ... Найдите "-swift.h" в примечании к выпуску https://developer.apple.com/library/content/documentation/Xcode /Conceptual/RN-Xcode-Archive/Chapters/xc6_release_notes.html
См. Обходной путь @ 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
, и все работало - мои тесты Objective-C объектов написаны на Objective-C , составленный должным образом и продолжал бежать, и я мог бы написать новые тесты для объектов Swift в Swift.Надеюсь это поможет!
источник
Foo
API внутриBar.m
.MyProject-Swift.h
в.m
файл.После того, как я опробовал все, что смог найти по этой теме, то, что у меня сработало, было на самом деле запускать приложение, хотя оно все еще показывало ошибку «ModuleName-Swift.h file not found».
Он исчез, и мое приложение работает отлично. Думаю, мне следовало подумать об этом раньше ... Ошибка продолжает повторяться, но после запуска приложения она всегда снова исчезает. Так что проблема для меня не совсем решена, но пока я могу продолжить работу над другими темами ...
источник
Просто
@testable import MyProject
сделал всю работу за меня.
источник
Как ни странно, я видел ту же ошибку, но только при нацеливании на устройство (а не на симулятор). Перед запуском теста я бы увидел красный восклицательный знак рядом с оператором импорта для «MyProjectNameTests-Swift.h».
Однако забавно то, что если я все равно запускаю тест (несмотря на эту очевидную ошибку сборки), то во время фазы сборки, которая происходит после этого, XCode действительно генерирует файл «MyProjectNameTests-Swift.h», а тест работает отлично!
Так что, по крайней мере, в моем случае, очевидно, что здесь не было необходимости в других решениях, хотя я считаю, что они тоже работают.
Я также должен отметить, что я удалил свой каталог DerivedData до этого, так что, возможно, этот шаг также стоит попробовать.
источник
mySwiftClassTests
(и любые другие быстрые классы, которые вы хотите использовать в objective-c) должны быть отмечены@objc
:@objc class MySwiftClassTests: XCTestCase
источник
Мне не удалось заставить его работать, добавив этот путь к файлу, упомянутый в других ответах, но я понял, что файл, в котором он жаловался, даже не тестировался. Мне просто нужно было удалить его с тестовой цели с помощью правой боковой панели служебных программ.
источник
Добавление файла .swift к этой цели устраняет проблему с ней.
источник