Swift 2.0的单元测试,@testable导入以及方案定位问题

19

我最近将我的应用程序和单元测试转换到Swift 2.0。在我的Tests.swift文件中,我使用@testable import AppName

由于一个问题导致子类不能在多个目标中执行(在这里查看问题),我的类EntityName只能是Target Membership AppName,而不是AppNameTests

问题是,一旦我切换到AppNameTests模式运行单元测试,模块AppName中的代码就无法找到EntityName类,我会收到以下错误:

  

使用未声明类型“EntityName”

如何使AppName在从AppNameTests方案运行测试时编译而实体类不是该方案的成员?

5个回答

20

由于无法在多个目标中执行子类,出现了问题。

当将相同的Swift代码编译为不同的目标时,编译器实际上生成了不同的类。虽然这是设计上的行为,但在运行应用程序的单元测试时几乎肯定不是您想要的结果。

以下是我建议您设置模型以允许测试的两种方式:

1. 公共模型(推荐)

在您的应用程序目标中:

import RealmSwift
public class MyModel: Object {}

这段代码应该 作为您应用程序目标的一部分进行编译,您的单元测试可以按照以下方式设置:

import MyApp
// should be able to access `MyModel`

够简单吗?

2. @Testable (仅适用于Swift 2)

这种方法依赖于在Swift 2中引入的@testable关键字。

在您的应用程序目标中:

import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`

再次强调,这段代码应作为您的应用程序目标的一部分进行编译,您的单元测试可以按照以下方式设置:

@testable import MyApp
// should be able to access `MyModel`

请确保MyApp的构建设置中已将Enable Testability设置为YES,以确保测试功能可用。

如果您正在构建一个框架,其中一些内部模型不应该对该框架的用户可见,那么这种方法可能比使用公共模型更好。

Realm在其文档中专门介绍了这些常见的测试方法,您可以在此处阅读:https://realm.io/docs/swift/latest/#avoid-linking-realm-and-tested-code-in-test-targets


没错,我可以使用@testable从我的测试中访问MyModel,但是在编译MyAppTests时,从MyApp内部访问模型的文件却不能访问!非常令人沮丧。 - Tyler
听起来你的项目配置有问题。如果我猜的话,我会说模型文件是与单元测试目标一起编译的,但不是与应用程序目标一起编译的。如果您将项目发送到help@realm.io,我很乐意帮助您解决问题。 - jpsim
1
嘿,事实证明我不得不停止针对整个MyApp模块进行测试的目标...疯了,现在它可以工作了! - Tyler
1
此外,为了让@testable import正常工作,测试目标必须是“单元测试包”(而不是UI测试包)。 - Rolleric
如果我只想导入一个Viper文件夹进行单元测试,那么包括整个应用程序的@testable import myApp的构建性能如何?我不想在Xcode上等待Kiwi测试。 - CDM social medias in bio

10

我不得不停止将我的整个应用程序的.swift文件针对MyAppTests进行成员资格定位,而是完全依赖于 @testable import MyApp


这正是它应该工作的方式。只编译一次! - jpsim
4
请注意,MyApp 必须是您项目中的产品模块名称(设置 -> 目标 -> 构建设置 -> 产品模块名称)。 - Pablo A.

0
我最近也遇到了这个错误,但以上步骤都没有解决问题。解决方法是从你想要运行测试的目标的编译源代码构建阶段中删除非 Swift 文件。这个问题默默地失败了。

enter image description here


0
首先确保在每个测试文件中都包含@testable import MyApp。然后,在您的测试目标构建阶段中,从“复制捆绑资源”部分中删除所有非测试文件。指向不在测试目标中的应用程序文件的测试目标中的应用程序文件会破坏您的单元测试。从测试目标中删除所有应用程序文件,并添加@testable标志,一切都应该正常工作!

0

我曾遇到类似的问题,原因是应用程序的所有源文件都链接到了单元测试目标上,导致编译两次!

此外,我通过Carthage安装了Realm,必须包含“Realm.framework”和“RealmSwift.framework”的两个目标(主目标和测试目标),否则将无法正常运行。

这里是问题链接。

https://github.com/realm/realm-cocoa/issues/3627


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接