在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败

Posted

技术标签:

【中文标题】在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败【英文标题】:OCMock failure mocking 'initWithAttributedString' on NSMutableAttributedString 【发布时间】:2013-03-12 11:36:09 【问题描述】:

我试图了解什么是可模拟的,什么不是。

在使用 NSMutableAttributedString 的实验中,我似乎无法模拟 initWithAttributedString

- (void)test_mutableString_shouldWorkAsAMutableString 
    NSMutableAttributedString *_mutable = [OCMockObject mockForClass:NSMutableAttributedString.class];
    NSAttributedString *_string = [OCMockObject mockForClass:NSAttributedString.class];
    [[[(id)_mutable expect] andReturnValue:nil] initWithAttributedString:_string];
    [_mutable initWithAttributedString:_string];

此代码不会运行;由于某种原因,可变屏幕的代理无法识别 initWithAttributedString 选择器:

2013-03-12 11:25:30.725 UnitTests[11316:c07] TestItClass/test_4_mutableString_shouldWorkAsAMutableString ✘ 0.00s

    Name: NSInvalidArgumentException
    File: Unknown
    Line: Unknown
    Reason: *** -[NSProxy doesNotRecognizeSelector:initWithAttributedString:] called!

    0   CoreFoundation                      0x01c0602e __exceptionPreprocess + 206
    1   libobjc.A.dylib                     0x01948e7e objc_exception_throw + 44
    2   CoreFoundation                      0x01c05deb +[NSException raise:format:] + 139
    3   Foundation                          0x00862bcd -[NSProxy doesNotRecognizeSelector:] + 75
    4   CoreFoundation                      0x01bf5bbc ___forwarding___ + 588
    5   CoreFoundation                      0x01bf594e _CF_forwarding_prep_0 + 14
    6   UnitTests                           0x00349e0b -[TestItClass test_4_mutableString_shouldWorkAsAMutableString] + 283

我试图了解如何可靠地使用 OCMock,但这让我感到困惑,我不确定哪些 OCMock 调用可以工作,哪些不应该工作。

我非常感谢您对此进行澄清,并提供有关上述内容为何不起作用的提示。

谢谢, 乔

【问题讨论】:

为什么需要模拟 NSAttributedString? David,我有一些以特定方式构建 NSAttributedString 的业务逻辑。为了测试该逻辑,我需要模拟属性字符串来测试交互。 【参考方案1】:

我 learned something about Objective-C 试图解决这个问题。

您的基本问题是通过分配 NSMutableAttributedString 创建的对象的类不是 NSMutableAttributedString (始终警惕免费桥接类)。要让您的代码正常工作,请尝试以下操作:

NSMutableAttributedString *realMutable = [[NSMutableAttributedString alloc] init];
id mutable = [OCMockObject niceMockForClass:[realMutable class]];
id string = [OCMockObject niceMockForClass:[NSAttributedString class]];

[[[mutable expect] andReturn:@"YO" ] initWithAttributedString:string];
NSLog(@"MOCK: %@", [mutable initWithAttributedString:string]);

[mutable verify];

// Outputs 'MOCK: YO' and passes

【讨论】:

啊,我明白了。这是隐藏这种争论并仍然使测试代码可维护的好方法。谢谢!

以上是关于在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败的主要内容,如果未能解决你的问题,请参考以下文章

分配的变量引用在哪里,在堆栈中还是在堆中?

NOIP 2015 & SDOI 2016 Round1 & CTSC 2016 & SDOI2016 Round2游记

秋的潇洒在啥?在啥在啥?

上传的数据在云端的怎么查看,保存在啥位置?

在 React 应用程序中在哪里转换数据 - 在 Express 中还是在前端使用 React?

存储在 plist 中的数据在模拟器中有效,但在设备中无效