Ios 单元测试Swift 2.0、@可测试导入和方案目标问题
我最近将我的应用程序和单元测试转换为Swift 2.0。我正在Tests.swift文件中使用Ios 单元测试Swift 2.0、@可测试导入和方案目标问题,ios,swift,unit-testing,swift2,realm,Ios,Swift,Unit Testing,Swift2,Realm,我最近将我的应用程序和单元测试转换为Swift 2.0。我正在Tests.swift文件中使用@testable import AppName 由于无法在多个目标()中执行子类的问题,我的类EntityName只能是目标成员AppName,而不能是AppNameTests 问题是,一旦我切换到AppNameTests模式来运行单元测试,模块AppName中的代码就找不到类EntityName,我得到了 使用未声明的类型“EntityName” 当从AppNameTests方案运行测试时,如果该实
@testable import AppName
由于无法在多个目标()中执行子类的问题,我的类EntityName
只能是目标成员AppName
,而不能是AppNameTests
问题是,一旦我切换到AppNameTests
模式来运行单元测试,模块AppName
中的代码就找不到类EntityName
,我得到了
使用未声明的类型“EntityName”
当从AppNameTests
方案运行测试时,如果该实体类不是方案的成员,如何让AppName
进行编译
由于无法在多个目标中执行子类的问题
当作为不同目标的一部分编译相同的Swift代码时,编译器实际上会生成不同的类。因此,它的行为符合设计,但几乎肯定不是运行应用程序单元测试时所需要的
我建议您通过两种方式设置模型以允许测试:
1.公共模型(推荐)
在应用程序目标中:
import RealmSwift
public class MyModel: Object {}
import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`
此代码只能作为应用程序目标的一部分进行编译,并且可以通过以下方式设置单元测试:
import MyApp
// should be able to access `MyModel`
@testable import MyApp
// should be able to access `MyModel`
够简单吗
2. @可测试(仅Swift 2)
这种方法依赖于Swift 2中引入的@testable
关键字
在应用程序目标中:
import RealmSwift
public class MyModel: Object {}
import RealmSwift
internal class MyModel: Object {} // ACL cannot be `private`
同样,此代码只能作为应用程序目标的一部分进行编译,并且可以通过以下方式设置单元测试:
import MyApp
// should be able to access `MyModel`
@testable import MyApp
// should be able to access `MyModel`
确保MyApp的构建设置已将启用可测试性
设置为是
如果您正在构建一个框架,而该框架的用户不应该访问某些内部模型,那么这种方法可能比公共模型更可取
Realm在其文档中有一个专门的部分,详细介绍了这些常见的测试方法,您可以在此处阅读:我必须停止针对我的整个应用程序。swift文件将成为MyAppTests的成员,仅仅依靠
@testable import MyApp
我最近也遇到了这个错误,上面的步骤都没有解决这个问题,解决这个问题的方法是从要运行测试的目标中的编译源代码构建阶段删除非swift文件。这是无声的失败
首先确保每个测试文件中都包含
@testable import MyApp
。然后,在测试目标构建阶段,从复制包资源部分删除所有非测试文件。测试目标中指向不在测试目标中的应用程序文件的应用程序文件正在破坏单元测试。从测试目标中删除所有应用程序文件并添加@testable
标志,一切都应该正常 我也有类似的问题,问题是所有的应用程序源文件都链接到单元测试目标,所以编译了两次
另外,我通过迦太基安装了Realm,并且必须包括框架“Realm.framework”和“RealmSwift.framework”的两个目标(main和test),因为否则它就无法工作
这里是问题链接
没错,我可以使用@testable从测试中访问MyModel,但在编译MyAppTests时,从MyApp中访问我的模型的文件不能!非常令人沮丧听起来你的项目配置有问题。如果让我猜的话,我会说模型文件是用单元测试目标编译的,而不是应用程序目标。如果你把你的项目发送到help@realm.io.hey,结果我不得不停止针对我整个MyApp模块的测试。。胡说八道,不是这样的!另外,要使@testable import起作用,测试目标必须是“单元测试包”(而不是UI测试包)。如果我只想导入一个viper文件夹进行单元测试,那么包含整个应用的
@testable import myApp
的构建性能如何?我不喜欢在Xcode上等待猕猴桃测试,这正是它应该如何工作的。只编译一次!注意MyApp
必须是项目中的产品模块名称(设置->目标->构建设置->产品模块名称)