- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我知道
@testable import MyModule
提供从“测试”(使用“testTarget”构建)模块 MyModuleTests
探索 MyModule
的非公共(public)成员的能力。
我的“非测试”模块需要相同的功能。不在生产中,只是在 Debug模式下。
我的问题是:你知道怎么做吗?
相关的(我认为,更难的问题):@testable
背后究竟发生了什么魔法?
最佳答案
要回答您的问题,出于调试目的,您实际上可以使用它。假设您有一个工作区 MyAwesomeWkspace
和一个位于 MyAwesomeProject
中的项目。
现在,创建一个名为 MyAwesomeModule
的新 framework
也称为 module
。在该模块中创建一个名为 Person
的非公共(public)类。
如果您尝试通过执行 import MyAwesomeModule
然后像 let p = Person( )
你会遇到一个错误。
但是如果您执行 @testable import MyAwesomeModule
,奇迹就会发生,您现在可以使用该类了。
基本上 @testable
允许您测试您没有声明为公开的内容。如您所见,注释仅适用于 import
here .
所以为了工作,目标是用-enable-testing
编译的,这样你就可以访问非公共(public)成员。至少基于什么是here
因为默认情况下,debug
构建配置是使用 -enable-testing
编译的,我向您展示的示例将起作用。但是,如果您将构建配置更改为 release
,您将看到一条错误消息,提示 Module .. was not compiled for testing
since the release
配置不是用标志 build 的。
The Swift access control model, as described in the Access Control section of The Swift Programming Language (Swift 4), prevents an external entity from accessing anything declared as internal in an app or framework. By default, to be able to access these items from your test code, you would need to elevate their access level to at least public, reducing the benefits of Swift’s type safety.
Xcode provides a two-part solution to this problem:
When you set the Enable Testability build setting to Yes, which is true by default for test builds in new projects, Xcode includes the -enable-testing flag during compilation. This makes the Swift entities declared in the compiled module eligible for a higher level of access. When you add the @testable attribute to an import statement for a module compiled with testing enabled, you activate the elevated access for that module in that scope. Classes and class members marked as internal or public behave as if they were marked open. Other entities marked as internal act as if they were declared public.
更多here
后期编辑:swift 的一个很酷的部分是它是开源的。因此,如果您想深入了解“魔法”,请查看:https://github.com/apple/swift
关于ios - XCTest 的@testable 幕后发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46798225/
请注意,这并非特定于 Protractor。问题在于 Angular 2 的内置 Testability service Protractor 碰巧使用。 Protractor 调用 Testabil
我随机得到错误: Failed: Error while waiting for Protractor to sync with the page: "both angularJS testabili
我刚刚向新项目添加了一些单元测试。通常我使用 @testable import 来导入生产代码,所以我可以测试非公共(public)方法: @testable import My-Project im
我收到一条错误消息: "Error while waiting for Protractor to synce with the page: "Cannot read property '$$test
我有一个用户定义的变量“MODULE_NAME_WITH_SUFFIX”,它在每个模式中都不同。 现在我需要在我的测试中导入这个模块名称,但不知道如何导入。 在我进行简单导入之前: @testable
我现在已经在几个项目中遇到过这个问题,所以很想找到一个好的解决方案。 考虑以下场景: 我在我的应用程序目标中定义了一个名为 MyObject 的对象,它在 MyBusinessLogicObject
我有一个应用程序需要引用一组引用代码(一个 3 个字符的代码及其相关的简短描述)。数据不会改变——或者至少我过去从未知道它会改变——但我仍然无法将其硬编码到应用程序代码中。 我最初的想法是创建一个静态
“@testable import”似乎没有导入原始项目中的所有文件。外部框架的文件作为单独的文件添加到原始项目中,除非检查“目标成员资格”以进行单元测试,否则测试用例似乎无法访问它们。奇怪的是,单元
我尝试在 Linux Ubuntu 16.04 上向我的 Swift 项目添加单元测试。现在我有了目录结构: MyProject |-Sources | └MyProject | |-IPcalc.
我一直在开发 android 应用程序,但没有编写任何单元测试。最近我开始了解它并尝试使用 JUnit 来测试我的 android 应用程序。 我发现大多数时候我在 API 调用中遇到错误,但我仍然不
我有一个混合了 Obj-C 和 Swift 的项目,我在让我的单元测试正常工作时遇到了一些问题。 我正在使用 @testable import moduleName 指令导入我的文件,但它似乎没有导入
我知道 @testable import MyModule 提供从“测试”(使用“testTarget”构建)模块 MyModuleTests 探索 MyModule 的非公共(public)成员的能
我正在编写一个简单的 P2P 应用程序来测试在更大的项目中使用 UDP 打洞的可行性。 我昨天在家试用了我的测试应用程序,它们运行良好。 但是,我现在在工作,相同的代码不再能胜任这项工作。发件人正在发
我正在尝试使用 Swift 的 @testable 声明将我的类暴露给测试目标。但是我收到了这个编译器错误: Intervals 是包含我要公开的类的模块。我该如何摆脱这个错误? 最佳答案 在您的主要
我创建了一个没有单元测试的 Xcode 项目。当我尝试创建新的单元测试并尝试导入 @testable import 'ProjectName' 时,我添加了 cocoa pod ,它给出了错误无法加载
您使用什么样的实践来使您的代码对单元测试更加友好? 最佳答案 TDD——首先编写测试,强制你要考虑可测试性和帮助编写实际的代码需要的,而不是你认为可能的需要 接口(interface)重构——使得 m
当我更新此字段中的显示名称时 我所有的测试都失败了,因为 @testable import HomeApp 需要更新才能匹配。 我一直觉得 Display Name 只是出现在您的应用程序和其他一些地
正如我多次看到的那样,一个自执行的匿名函数用于包含整个库。如何测试这些库,例如QUnit 无法访问匿名函数包装器内的任何内容? 最佳答案 我同意你不想执行 Backdoor Manipulation通
直到现在,我习惯于在 ready() 函数中编写所有代码,例如: $(document).ready(function() { // all my code }); 现在我看到使用这种方法时,我的
据说 "static methods are death to testability" 。如果是这样,下面的可行替代模式是什么? class User { private $phone,
我是一名优秀的程序员,十分优秀!