Подтвердить что ты не робот

Модуль "MyApp" не найден в UnitTest-Swift

Я пытаюсь проверить класс Swift (класс @objc) в моем устаревшем коде Objc. Я импортирую "UnitTests-Swift.h" в своих тестовых классах.

Затем я получаю эту ошибку:

Модуль "MyApp" не найден в автогенерированном "UnitTests-Swift.h"

Это то, что находится внутри верхней части "UnitTests-Swift.h"

typedef int swift_int3  __attribute__((__ext_vector_type__(3)));
typedef int swift_int4  __attribute__((__ext_vector_type__(4)));
#if defined(__has_feature) && __has_feature(modules)
@import XCTest;
@import ObjectiveC;
@import MyApp;
@import CoreData;
#endif

Я очистил проект, проверил все соответствующие флаги ( "Нет такого модуля" , при использовании @testable в тестах Xcode Unit, Невозможно использовать классы Swift внутри Objective-C), удалить производные данные и т.д. Не знаю, что происходит, но я уверен, что @import MyApp не должен быть там.

Может ли кто-нибудь помочь мне с этим?

4b9b3361

Ответ 1

Только что получил эту проблему в моем проекте, и после целого дня, проведенного на расследовании, я, наконец, решил это. В основном это происходит потому, что у вас есть циклическая зависимость между ObjC и Swift. Так что в моем случае это было:

  • Swift Protocol с атрибутом @obj в главной цели;
  • Swift Class в цели UnitTest, которая унаследовала этот протокол;
  • Импортировать UnitTestTarget-Swift.h в любой класс Objective-C вашего объекта UnitTest

Таким образом, довольно простая комбинация приводит к этой ошибке. Чтобы исправить это, вы также хотите:

  • просто убедитесь, что ваш Swift Class в цель UnitTest private, поэтому он не достигнет UnitTestTarget-Swift.h

или

  • не отмечайте свой первоначальный Swift Protocol как @objc, который позволит вам получить доступ к вашему SwiftClass из всех тестовых классов ObjectiveC, но эти классы не будут иметь никакого представления о Swift Protocol.

Ответ 2

Поскольку класс Swift для тестирования является частью MyApp, вы должны импортировать "MyApp-Swift.h" в тестовых классах вместо "UnitTests-Swift.h".

Ответ 3

Вы можете добавить Swift unit test (просто создайте новый файл устройства и измените расширение на .swift).

Из этого файла unit test вы можете использовать свои классы Swift.

И вы также можете импортировать этот файл из своих модульных тестов Objective-C (и наоборот) с использованием заголовков мостов тестового модуля.

И это будет пример по умолчанию для вашего файла Swift unit test:

import XCTest
@testable import MyApp

class MyAppSwiftTests: 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.
    // Use XCTAssert and related functions to verify your tests produce the correct results.
  }

  func testPerformanceExample() {

    // This is an example of a performance test case.
    self.measure {
      // Put the code you want to measure the time of here.
    }
  }
}