关于ios:Unit Test-Swift中找不到模块“MyApp”

Module “MyApp” not found in UnitTest-Swift

我试图在我的旧objc代码中测试一些swift类(@objc类)。我正在我的测试类中导入"unittests swift.h"。

然后我得到这个错误:

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

这是"Unittests swift.h"顶部的内容

1
2
3
4
5
6
7
8
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

我清理了项目,检查了所有相关的标志("在xcode单元测试中使用@testable时没有这样的模块",不能在objective-c中使用swift类),删除了派生数据等。不知道会发生什么,但我很确定@import myapp不应该出现在那里。

有人能帮我吗?


在我的项目中刚刚得到这个问题,在花了一整天的时间进行调查之后,我终于解决了它。基本上,这是因为objc和swift之间存在循环依赖关系。所以在我的例子中是:

  • 主目标中具有@obj属性的swift协议;
  • 继承此协议的UnitTest目标中的Swift类;
  • 在UnitTest目标的任何Objective-C类中导入EDOCX1[2]

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

  • 只需确保你在UnitTest目标中的swift类是private,这样它就不会到达UnitTestTarget-Swift.h

  • 不要将原来的Swift协议标记为@objc,这将允许您从所有客观性测试类访问Swift类,但这些类对Swift协议没有任何概念。

这个解决方案帮助我:

  • 打开测试目标生成设置
  • 搜索HEADER_SEARCH_PATHS
  • 在名为"header search path"的行中,设置值$CONFIGURATION_TEMP_DIR/myProjectName.build/DerivedSources
  • 清除并再次命令+U
  • 希望它有帮助!

    多亏了这篇文章。


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

    从那个单元测试文件中,您可以使用您的swift类。

    您还可以使用测试模块桥接头从Objective-C单元测试(和其他方法)中导入该文件。

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    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.
        }
      }
    }

    因为要测试的swift类是myapp的一部分,所以您应该在测试类中导入"myapp swift.h",而不是"unittests swift.h"。