@testable导入导致奇怪的编译错误

时间:2019-05-13 13:23:26

标签: ios swift xctest

我刚刚在新项目中添加了一些单元测试。通常我使用@testable import导入生产代码,因此可以测试非公共方法:

@testable import My-Project
import XCTest

final class MyTests: XCTestCase {
   func testOne() {
       // ...
   }
}

但是我看到一些奇怪的编译错误,这是我之前从未见过的:

Tests.swift:1:25: Consecutive statements on a line must be separated by ';'
Tests.swift:1:25: Expected expression after unary operator
Tests.swift:1:25: Expressions are not allowed at the top level
Tests.swift:1:18: No such module 'My'

我已经检查并仔细检查了所有内容,但无法弄清为什么会产生此编译错误。

我想念什么?

2 个答案:

答案 0 :(得分:2)

项目和目标名称可以包含特殊字符(如空格或破折号),而模块名称则不能。默认情况下,Xcode通过用下划线替换无效字符来从目标名称生成模块名称。

因此,就您而言

@testable import My_Project

将解决此问题。或者,在目标的构建设置中分配自定义的“产品模块名称”。

无需重命名整个项目(或目标)。

答案 1 :(得分:0)

项目名称(以及内部模块名称)包含短划线(-)字符。

要解决此问题:

  1. 在Xcode项目浏览器中选择顶级项目文件图标
  2. 按Enter键重命名项目
  3. 从项目名称中删除破折号
  4. 按照提示进行最终重构
  5. 更新您的@testable import ...语句以反映新的模块名称。