XCTest 的 @testable 幕后发生了什么?

2024-02-16

我知道

@testable import MyModule

提供探索非公开成员的能力MyModule来自“test”(使用“testTarget”构建)模块MyModuleTests.

我的“非测试”模块需要相同的功能。不在生产中,仅在调试模式下。

我的问题是:你知道该怎么做吗?

相关的(我认为是更难的问题):背后到底发生了什么魔法@testable?


为了回答您的问题,出于调试目的,您实际上可以使用它。假设您有一个工作空间MyAwesomeWkspace和里面的一个项目MyAwesomeProject.

现在,创建一个新的framework aka module called MyAwesomeModule。在该模块内创建一个名为的非公共类Person.

如果您尝试使用该类Person inside MyAwesomeProject通过做import MyAwesomeModule然后类似的东西let p = Person()你会遇到一个错误。

但如果你这样做@testable import MyAwesomeModule,奇迹发生了,您现在可以使用该类了。

基本上@testable允许您测试未公开声明的内容。该注释仅适用于import如你所见here https://github.com/apple/swift/blob/89c4ab0bb0de3d3aaf92f15c294c2db17a06040e/test/attr/testable.swift.

因此,为了工作,目标是用-enable-testing这样您就可以访问非公开成员。至少基于什么here https://github.com/apple/swift/blob/aee81d272f3147c0a9b610956e72a7c0772b8bcb/include/swift/Basic/LangOptions.h#L132

因为,默认情况下,debug构建配置是用-enable-testing,我向您展示的示例将起作用。但是如果你将构建配置更改为release,你会看到一条错误消息Module .. was not compiled for testing自从release配置不是用该标志构建的。

Swift 访问控制模型,如访问控制中所述 Swift 编程语言 (Swift 4) 的部分,防止 外部实体访问应用程序中声明为内部的任何内容 或框架。默认情况下,能够从您的 测试代码,您需要将他们的访问级别至少提升到 public,减少了 Swift 类型安全的好处。

Xcode 为这个问题提供了一个由两部分组成的解决方案:

当您将启用可测试性构建设置设置为是时,即 对于新项目中的测试构建,默认情况下为 true,Xcode 包括 - 编译期间启用测试标志。这使得编译模块中声明的 Swift 实体有资格获得更高级别的访问权限。 当您将 @testable 属性添加到导入语句时 模块在启用测试的情况下编译,您激活提升的访问权限 对于该范围内的该模块。类和类成员标记为 内部或公共的行为就好像它们被标记为打开一样。其他实体 标记为内部行为,就好像它们被宣布为公开一样。

More here https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/testing_with_xcode/chapters/04-writing_tests.html

后期编辑:Swift 最酷的部分之一是它是开源的。因此,如果您想深入了解“魔法”,请查看:https://github.com/apple/swift https://github.com/apple/swift

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XCTest 的 @testable 幕后发生了什么? 的相关文章

  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • 有关 Swift 编译器选项的文档

    您好 我想开始在 Apple Swift 语言上运行一些微基准测试 然而 我觉得很难找到有关编译器优化的不同选项的适当文档 我读过很多关于其他人的语言微基准的问题和文章 但是如果能有一些关于该主题的可靠文档那就太好了 在最新的测试版中 使用
  • 从一个模态视图无缝翻转到另一个模态视图,而不显示纯色背景

    我的 iPad 应用程序的 UI 如下 当我点击Settings按钮 我希望对话框水平翻转以显示设置对话框 我这个工作正常 但是 当对话翻转时会显示背景颜色 如你看到的 有什么办法可以让对话框翻转时不显示该颜色块吗 我希望它看起来更加无缝
  • 无法在 Swift 中对闭包进行弱引用

    Update 我试着不弱化地写一下 好像也没有漏的情况 所以也许这个问题已经没有必要了 在 Objective C ARC 中 当你想让一个闭包能够在闭包内部使用它自己时 该块不能捕获对自身的强引用 否则它将是一个保留循环 因此您可以使闭包
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • 从按钮执行 Segue 时应用程序冻结

    我的故事板中有一个按钮 它呈现一个带有模式序列的视图控制器 每次按下此按钮时 应用程序都会冻结 没有崩溃 也没有错误消息 prepareForSegue被调用 所有应该存在的视图控制器都在代码中prepareForSegue 但它们不会出现
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • ReactiveCocoa 将 SignalProducers 合二为一

    我正在使用 ReactiveCocoa 并且我有几个 SignalProducers let center NSNotificationCenter defaultCenter let signalProducer1 center rac
  • 在 UIWebView 中播放 Facebook 视频

    有谁知道如何在 Facebook 上播放视频UIWebView 我的应用程序将视频上 传到 Facebook 并检索视频的网址 我想将此网址嵌入到UIWebView播放 我已经为 youtube 解决了这个问题 但没有为 Facebook
  • 在实例化对象之前是否可以检查故事板中是否存在标识符?

    在我的代码中我有这一行 但我想知道是否有办法检查是否 一些控制器 在我将它与 一起使用之前就存在实例化ViewControllerWithIdentifier 方法 如果标识符不存在 则应用程序崩溃 如果没有好的方法 这并不是一个大问题 我
  • Objective-C 中发送给对象的消息可以被监听或者打印出来吗? [复制]

    这个问题在这里已经有答案了 可能的重复 Objective C 中拦截方法调用 https stackoverflow com questions 1618474 intercept method call in objective c 如
  • 在 Swift 中从 Parse 加载图像

    我成功地将数据从 Parse 提取到 swift 中 但我的图像似乎没有按照我的方式工作 在我的 cellForRowAtIndexPath 方法中 我执行以下操作 var event AnyObject eventContainerArr
  • 对 Mac“捆绑”文件进行版本控制的最佳方法

    所以你知道很多 Mac 应用程序都使用 捆绑包 对于你的应用程序来说 它看起来像是一个文件 但实际上它是一个包含许多文件的文件夹 对于要处理此问题的版本控制系统 它需要 检出目录中的所有文件 以便应用程序可以根据需要修改它们 at chec
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • 构建 Windows 版 Linphone 时出错

    我正在尝试按照以下说明构建适用于 Windows 的 linphoneReadme mingw使用 MinGw Msys 在下载belle sip包之前没有任何问题 当我跑步时 autogen sh我收到以下错误 Generating bu
  • Ruby 多字符串替换

    str Hello World 预期输出是 Hello World 我可以做这个 str gsub gsub 有没有其他方法可以在单个函数调用中完成此操作 就像是 str gsub s1 s2 r1 r2 从 Ruby 1 9 2 开始 S
  • RPG - 存储半复杂树结构的玩家数据

    我正在 js 中制作一个 web RPG 使用 melon JS 和 SQL DB 以及 PHP 这个问题是关于如何存储每个非玩家角色 NPC 的已完成任务和当前任务 NPC对话和任务数据 所有对话框都存储在一个js对象中 结构如下 var
  • 朱莉娅 评估数学树的最快方法是什么

    I have a tree of data representing a mathematical function like this 它存储在数组中 因此 2 3 2 将表示为 2 2 3 为了实际评估树 我有一个递归函数 functi
  • 在文本框中输入时搜索列表 VueJS 2

    我有一个来自数组的用户列表 我想根据顶部的搜索框 名称 过滤它们 我看到VueJS 1中有过滤器 但在VuesJS 2中不可用 如何在VueJS 2中实现这一点
  • 以内核模式运行的进程和以 root 身份运行的进程之间的区别?

    我知道在用户模式下运行的进程和在内核模式下运行的进程之间的区别 基于访问限制 对硬件的访问等 但出于好奇 以内核模式运行的进程与以 root 身份运行的进程有什么区别 内核模式和根是两个独立的概念 彼此之间并不真正相关 以 root 身份运
  • 对象创建语法之间的区别[重复]

    这个问题在这里已经有答案了 请解释对象一和对象二之间的区别 car one new opel opel two new opel 欧宝类扩展了汽车类 你可以重新分配one到某个其他子类的对象car one new Ford 但你不能重新分配
  • 如何在 BigQuery 的标准 SQL 中实现 RATIO_TO_REPORT()?

    我有一个使用 RATIO TO REPORT 的旧版 SQL 查询 它不使用开放访问表 但它是这样的 SELECT Mutation AA Gene name CaseCount RATIO TO REPORT CaseCount OVER
  • Angular2中如何将值从一个组件传递到另一个组件?

    我正在尝试将值从 Angular2 中的一个组件传递到另一个组件 例如 我正在尝试实现一个组件并在该组件中设置数据和标题 然后将该数据和标题传递给嵌入其中的另一个组件 这是更好解释的代码
  • 施特拉森的矩阵乘法在哪里有用?

    Strassen 的矩阵乘法算法仅比传统算法略有改进O N 3 算法 它具有更高的常数因子并且更难以实现 鉴于这些缺点 strassens 算法实际上有用吗 它是否在任何矩阵乘法库中实现 此外 矩阵乘法在库中是如何实现的 一般来说 施特拉森
  • 重试 MySQL / SQLAlchemy 的死锁

    我已经搜索了很长一段时间 但找不到解决我的问题的方法 我们在项目中将 SQLAlchemy 与 MySQL 结合使用 并且多次遇到可怕的错误 1213 尝试获取锁定时发现死锁 尝试重新启动事务 在这种情况下 我们最多尝试重新启动交易三次 我
  • Selenium - 使用透明代理的 MoveToElement()

    我有元素 public ArticlePage PageFactory InitElements Browser driver this FindsBy How How Id Using someId private IWebElement
  • 命令行无法识别 Node-sass

    我正在尝试设置node sass 遵循CSS Tricks 说明 https css tricks com why npm scripts Node 和 npm 已正确安装 node sass 安装也正常 当我去跑步时node sass o
  • 如何设置对 Azure 应用服务的 FTP 访问?

    我使用 Visual Studio 将我的网站 发布 到 Azure 看起来工作正常 现在我希望能够将文件通过 FTP 传输到此应用程序服务 但是 如何在此应用服务中设置 FTP 凭据 以便可以通过 FTP 进行身份验证 我本来希望在 部署
  • 创建新的 AVD-CPU/ABI 字段显示“未安装系统映像”

    我正在创建一个新的 AVD 我用 ARM CPU 镜像创建了一个 但大约 45 分钟后仍无法启动 所以我删除了它并下载了 Intel x86 Atom 映像 创建 AVD 时 选择 CPU 的字段变为非活动状态 并显示 未为此目标安装系统映
  • Powershell StreamReader - 如何等待新文件可读

    我的脚本通常假设存在一个 txt 文件 其中包含有助于其更好运行的设置 但是 如果该脚本不存在 它会创建一个本地文件来保存这些设置 我意识到这没有逻辑need然后阅读此文件 但我想了解为什么我不能 void System IO File C
  • 使用 Polymer 和 app-route 每次点击时重新加载页面

    我正在使用 app route 和iron pages 以及纸质工具栏来显示我的视图 就我的一个观点来说 main view 显示随机选择的图像 该图像每次加载页面时都会发生变化 每次main view从工具栏中选择后 页面应重新加载 以便
  • 粘性元素不与同级元素一起向上滚动?

    这是我之前问题的延伸 如何使元素具有粘性但可与同级元素一起滚动到其完整 可变 高度 https stackoverflow com questions 75469958 how to make an element sticky but s
  • 为什么 HTTPS 请求会产生 SSL CERTIFICATE_VERIFY_FAILED 错误?

    这是我的Python代码 import requests requests get https google com 这是错误 requests exceptions SSLError HTTPSConnectionPool host go
  • XCTest 的 @testable 幕后发生了什么?

    我知道 testable import MyModule 提供探索非公开成员的能力MyModule来自 test 使用 testTarget 构建 模块MyModuleTests 我的 非测试 模块需要相同的功能 不在生产中 仅在调试模式下