在UnitTest-Swift中找不到模块“MyApp”

时间:2015-11-13 08:45:08

标签: ios xcode swift2 swift3 xcode7

我试图在我的遗留Objc代码中测试一些Swift类(@objc类)。我在我的测试类中导入“UnitTests-Swift.h”。

然后我收到此错误:

  

在自动生成的“UnitTests-Swift.h”中找不到模块“MyApp”

这是“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

我清理了项目,检查了所有相关标志("No such module" when using @testable in Xcode Unit testsCan't use Swift classes inside Objective-C),删除了派生数据等等。不知道发生了什么,但我很确定@import MyApp不应该在那里..

任何人都可以帮我吗?

4 个答案:

答案 0 :(得分:3)

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

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

如此简单的组合会导致此错误。为了解决这个问题,您需要:

  • 只需确保您在UnitTest目标中的Swift类为private,因此它无法访问UnitTestTarget-Swift.h

  • 不要将您原来的Swift协议标记为@objc,这将允许您从所有ObjectiveC测试类访问您的SwiftClass,但这些类不会对Swift协议有任何了解。

答案 1 :(得分:0)

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

答案 2 :(得分: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.
    }
  }
}

答案 3 :(得分:0)

此解决方案对我有帮助:

  1. 打开测试目标版本设置
  2. 搜索HEADER_SEARCH_PATHS
  3. 在名为“标题搜索路径”的行中,设置值$CONFIGURATION_TEMP_DIR/myProjectName.build/DerivedSources
  4. 再次清洁并按Cmd + U

希望有帮助!

非常感谢article