16

Im trying to test some Swift class (@objc class) in my legacy Objc code. I am importing "UnitTests-Swift.h" in my test classes.

Then I get this error:

Module "MyApp" not found in the autogenerated "UnitTests-Swift.h"

This is whats inside the top part of the "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

I cleaned the project, checked all the relevant flags ("No such module" when using @testable in Xcode Unit tests, Can't use Swift classes inside Objective-C), removed derived data and so on.. No idea of whats happening, but I m quite sure that @import MyApp shouldnt be there..

Can anyone help me with this?

4

4 回答 4

7

刚刚在我的项目中遇到了这个问题,经过一整天的调查,我终于解决了。基本上这是因为您在 ObjC 和 Swift 之间存在循环依赖关系。所以在我的情况下是:

  • @obj主目标中具有属性的Swift 协议;
  • 继承此协议的 UnitTest 目标中的 Swift 类;
  • 导入UnitTestTarget-Swift.hUnitTest 目标的任何 Objective-C 类

所以相当简单的组合导致了这个错误。为了解决这个问题,您需要:

  • 只需确保您在 UnitTest 目标中的 Swift 类是private,所以它不会到达UnitTestTarget-Swift.h

或者

  • 不要将您的原始 Swift 协议标记为@objc,这将允许您从所有 ObjectiveC 测试类访问您的 SwiftClass,但这些类不会对 Swift 协议有任何了解。
于 2017-10-03T16:00:53.673 回答
0

因为要测试的 Swift 类是 MyApp 的一部分,所以您应该在测试类中导入“MyApp-Swift.h”而不是“UnitTests-Swift.h”。

于 2017-02-28T00:42:52.550 回答
0

您可以添加一个 Swift 单元测试(只需创建一个新的单元文件并将扩展名更改为.swift)。

从该单元测试文件中,您可以使用您的 Swift 类。

您还可以使用测试模块桥接头从您的 Objective-C 单元测试(反之亦然)导入该文件。

这将是您的 Swift 单元测试文件的默认示例:

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.
    }
  }
}
于 2017-03-02T13:51:15.510 回答
0

这个解决方案帮助了我:

  1. 打开测试目标构建设置
  2. 搜索HEADER_SEARCH_PATHS
  3. 在名为“Header Search Paths”的行中设置值$CONFIGURATION_TEMP_DIR/myProjectName.build/DerivedSources
  4. 再次清理并 Cmd+U

希望能帮助到你!

非常感谢这篇文章

于 2018-10-20T12:56:26.663 回答