如何让 ARC 下的 OCMock 停止使用弱属性清空 NSProxy 子类集?

2023-11-22

Under ARC,我有一个对象,Child有一个weak财产,parent。我正在尝试编写一些测试Child,我嘲笑它parent财产使用OCMock.

在 ARC 下,设置NSProxy使用合成弱属性设置器的子类不会设置属性...设置弱属性后的行,检查它发现它已经nil。这是具体的例子:

@interface Child : NSObject
@property (nonatomic, weak) id <ParentInterface>parent;
@end

@implementation Child
@synthesize parent = parent_;
@end

//  ... later, inside a test class ...

- (void)testParentExists
{
    // `mockForProtocol` returns an `NSProxy` subclass
    //
    OCMockObject *aParent = [OCMockObject mockForProtocol:@protocol(ParentInterface)];
    assertThat(aParent, notNilValue());

    // `Child` is the class under test
    //
    Child *child = [[Child alloc] init];
    assertThat(child, notNilValue());

    assertThat(child.parent, nilValue());
    child.parent = (id<ParentInterface>)aParent;
    assertThat([child parent], notNilValue());  // <-- This assertion fails
    [aParent self]; // <-- Added this reference just to ensure `aParent` was valid until the end of the test.
}

我知道我可以使用assign属性而不是weak财产为Child来参考Parent,但那时我必须nilparent当我完成它时(就像某种穴居人),这正是 ARC 应该避免的事情。

关于如何在不更改我的应用程序代码的情况下通过此测试有什么建议吗?

Edit: 好像也有关系OCMockObject是一个NSProxy,如果我做aParent是一个实例NSObject, the child.parent弱引用“持有”非零值。仍在寻找一种无需更改应用程序代码即可通过此测试的方法。

Edit 2:接受布莱克的回答后,我在我的项目中实现了一个预处理器宏,该宏有条件地更改了我的属性,从弱到分配。你的旅费可能会改变:

#if __has_feature(objc_arc)
#define BBE_WEAK_PROPERTY(type, name) @property (weak, nonatomic) type name
#else
#define BBE_WEAK_PROPERTY(type, name) @property (assign, nonatomic) type name
#endif

我们一直在努力解决同样的问题,它确实与 ARC 和对 NSProxy 派生对象的弱引用之间的不兼容有关。我建议使用预处理器指令有条件地编译弱委托引用以在测试套件中分配,以便您可以通过 OCMock 测试它们。

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

如何让 ARC 下的 OCMock 停止使用弱属性清空 NSProxy 子类集? 的相关文章

  • UITableView:显示 tableFooterView 时运行代码?

    我正在使用 UIView表页脚视图 http developer apple com library ios documentation uikit reference UITableView Class Reference Referen
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc
  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • 如何在iOS中处理1到3个手指的滑动手势

    我使用以下代码来处理代码中的 1 根手指滑动 UISwipeGestureRecognizer swipe UISwipeGestureRecognizer alloc initWithTarget self action selector
  • locationOfTouch 和 numberOfTouches

    你好 我有这个识别器 设置为 2 次触摸 但它只返回一个 而不是两个 CGPoint void gestureLoad UIGestureRecognizer recognizer recognizer UITapGestureRecogn
  • Cocoa 应用程序菜单栏不可点击

    我正在我的可可应用程序中构建一个菜单栏 其中包含以下代码 implementation我的自定义应用程序CustomApplication void setUpMenuBar CustomApplication sharedApplicat
  • 调整 UIImage 的大小而不将其完全加载到内存中?

    我正在开发一个应用程序 用户可以在其中尝试加载非常非常大的图像 这些图像首先在表格视图中显示为缩略图 我的原始代码会在大图像上崩溃 因此我重写它以首先将图像直接下载到磁盘 是否有一种已知的方法可以调整磁盘上图像的大小 而无需通过以下方式将其
  • 访问目标 c 中的类方法。使用 self 还是类名?

    我正在学习 iOS 编程 并且对以下有关关键字 self 的使用的代码感到困惑 据我了解 self就像Java的this 它指的是当前实例 当我想调用类方法时 通常的方式应该是这样 PlayingCard validSuits 但是侵入实例
  • 如何使用 jUnit 将测试用例添加到套件中?

    我有 2 个测试类 都扩展了TestCase 每个类都包含一堆针对我的程序运行的单独测试 如何将这两个类 以及它们拥有的所有测试 作为同一套件的一部分执行 我正在使用 jUnit 4 8 在 jUnit4 中你有这样的东西 RunWith
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 如何在 UICollectionView 中将行居中?

    我有一个UICollectionView与随机细胞 有什么方法可以让我将行居中吗 默认情况下它是这样的 x x x x x x x x x x x x x x 这是所需的布局 x x x x x x x x x x x x 我必须做这样的事
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • ld:找不到 -lGoogleToolboxForMac 的库

    我正在通过 pod 实施 firebase 设置 我的 Pods 文件如下所示 Uncomment the next line to define a global platform for your project platform io
  • ios如何搜索目录

    我想知道如何检查我的应用程序中是否存在目录 例如 如果我想搜索我的应用程序文档中是否存在文件夹 以及如何在其中创建新文件夹 此致 检查文件是否存在 BOOL fileExistsAtAbsolutePath NSString filenam
  • 强制本地化图像或图像资产

    正如在这个问题中 如何强制 NSLocalizedString 使用特定语言 https stackoverflow com questions 1669645 how to force nslocalizedstring to use a
  • Objective-C 属性和内存管理

    给出以下属性定义 property nonatomic retain MyObject foo 以下代码是否会导致内存泄漏 self foo MyObject alloc init 看起来 alloc 调用将对象上的保留计数增加到 1 然后
  • 如何对这个 Flask 应用程序进行单元测试?

    我有一个 Flask 应用程序 它使用 Flask Restless 来提供 API 我刚刚写了一些身份验证来检查 如果消费者主机被识别 该请求包含一个哈希值 通过加密 POST 的请求内容和 GET 的 URL 以及秘密 API 密钥来计
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • 在 UIScrollView 中禁用 2 根手指滚动

    我想在我的应用程序中禁用两指滚动UIScrollView 我对其进行了子类化 并使用以下代码调整了其内置手势识别器 for UIGestureRecognizer mgestureRecognizer in scroller gesture
  • 当键盘出现时调整 UITextView 的大小

    我想在键盘出现时调整文本视图的大小 我的代码如下 我打开了自动布局 因此使用来自超级视图的 textView gt bottom 空间的约束 并通过 IBOutlet distanceFromBottom 引用它 void keyboard

随机推荐

  • 如何使用正则表达式分割字符串

    我想将一个字符串拆分为列表或数组 Input green yellow green white orange blue black 分割字符是逗号 但它必须忽略引号内的逗号 输出应该是 green 黄绿色 white orange 蓝黑 T
  • mvc.net验证是否支持ValidationGroup的概念

    来自 asp net 的背景 在向页面添加验证时 我非常欣赏 validationGroup 的概念 我一直在 mvc net 中寻找相应的概念 但运气不佳 这个概念在 mvc net 中可用吗 如果没有 我还有什么选择 不幸的是 它没有附
  • 有人有渲染 HTML 的 diff 算法吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我有兴趣看到一个好的 diff 算法 可能是用 Javascript 编写的 用于渲染两个 HTML 页面的并排差异 这个想法是 diff 将显示差
  • 生命周期和对包含引用的对象的引用

    假设我有一个包含引用的结构 以及另一个包含对该结构的引用的结构 如下所示 struct Image lt a gt pixel data a mut Vec
  • 运行 Android 测试会产生“未知的命令行选项‘--tests’”

    我需要使用命令行在快速文件中的应用程序的特定包中使用 Gradle 运行测试 我正在使用这个命令 sh gradlew test tests com package exemple 但它给了我这个错误 从命令行配置任务 app test 时
  • 关闭 ContentProvider 中的数据库

    本周我学习了有关 ContentProvider 的所有内容 并使用 SQLiteOpenHelper 类来管理提供程序内部数据库的创建和升级 具体来说 我一直在阅读 sdk 示例目录中的 NotePad 示例 现在 我可以看到 SQLit
  • 非常快的文本文件处理(C++)

    我编写了一个在 GPU 上处理数据的应用程序 代码运行良好 但我遇到的问题是输入文件的读取部分 3GB 文本 是我的应用程序的瓶颈 从HDD读取速度快 但逐行处理速度慢 我使用 getline 读取一行并将第 1 行复制到向量 将第 2 行
  • cmd 脚本中的日期算术

    我需要编写一个脚本将文件名从 aDate txt 更改为 bDate txt 其中 aDate 是当前系统日期yyyymmdd格式和 bDate 是当前系统日期 1 inyyyymmdd format 我目前有 set yy date 6
  • Firestore 对象数据类型规则

    数据库有一个集合 Collection 集合内的每个文档都有一个对象 members 其中包含有权访问该文档的用户的 uid Collection gt document gt members BZntnJO2PVS8OZ9wctwHiyx
  • C# - 用数据表填充组合框

    我习惯于使用 Java 那里有大量的示例 由于各种原因 我不得不切换到 C 并尝试在 SharpDevelop 中执行以下操作 Form has a menu containing a combobox added via SharpDev
  • 使用autonomousSingleAppModePermissionAppIDs和UIAccessibilityRequestGuidedAccessSession与Meraki一起作为MDM进入单一应用程序模式

    我使用 Apple Configurator 将少量设备设置为受监管 但是 我无法使用以下命令让应用程序成功进入单一应用程序模式UIAccessibilityRequestGuidedAccessSession API 我创建了一个配置文件
  • 如何使用 mongodb 验证器验证对象数组?

    我一直在尝试使用 MongoDB 提供的验证器来验证我的数据 但遇到了问题 这是我要插入的一个简单的用户文档 name foo surname bar books name ABC no 19 name DEF no 64 name GHI
  • 集成 - Apache Flink + Spring Boot

    我正在测试 Apache Flink 和 Spring Boot 之间的集成 在 IDE 上运行它们很好 但是当我尝试在 Apache Flink Cluster 上运行时 我遇到了一个与 ClassLoader 相关的异常 这些课程非常简
  • 如何修复“(java:22494):Gdk-警告...”

    我正在编写一个 javafx 程序 我需要面板以恒定的速度更新 现在它设置为每秒更新一次 但我遇到了这个错误 通常 但并非总是 当整个场景变得扭曲时 面板中会出现故障 它就像镜子本身以奇怪的断断续续的 x 模式一样 很难解释 完整错误 ja
  • 如何在Python中获取当前脚本的代码?

    我想将当前脚本作为 Python 变量中的字符串获取 我发现了两种次优的方法 但我希望有更好的解决方案 我发现 The inspect导入有一个getsource方法 但只返回一个函数 或类或其他 的代码 而不是整个脚本 我找不到将整个脚本
  • 解析简单日期时间

    DateTime dt DateTime ParseExact 1122010 Mddyyyy System Globalization CultureInfo CurrentCulture 引发此异常 字符串未被识别为有效的日期时间 我确
  • 流的包含 takeWhile()

    我想知道是否有一种方法可以添加根据方法的条件进行测试的流的最后一个元素takeWhile 我相信我想要实现类似于 RxJava 的东西takeUntil method 我猜没有直接的方法可以做到这一点 如果我错了 请纠正我 但我想知道是否有
  • 一个简单的程序来CRUD节点和xml文件的节点值[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我决定将设置保存在 xml 文件中 因为字段仅采用一个值 我的 XML 文件是这样的
  • 不区分大小写的字符串与 linq-to-sql 和 linq-to-objects 进行比较

    也可以看看LINQ to Objects 和 LINQ to SQL 查询之间的差异 我们正在使用some对我们的查询database和我们的内存中的对象 与 linq to sql 进行不敏感字符串比较的最佳方法是什么 它在 SQL Se
  • 如何让 ARC 下的 OCMock 停止使用弱属性清空 NSProxy 子类集?

    Under ARC 我有一个对象 Child有一个weak财产 parent 我正在尝试编写一些测试Child 我嘲笑它parent财产使用OCMock 在 ARC 下 设置NSProxy使用合成弱属性设置器的子类不会设置属性 设置弱属性后