gpt4 book ai didi

objective-c - 调用 + [NSBundle bundleForClass :] on a partially mocked object is returning a different result than the unmocked object?

转载 作者:行者123 更新时间:2023-12-04 04:40:03 30 4
gpt4 key购买 nike

我正在使用 XCTest 和 OCMock 2.2.1 进行单元测试。我有一个类使用以下方法获取包标识符:

NSString *bundleIdentifier = [[NSBundle bundleForClass:[self class]] bundleIdentifier];

这在运行应用程序或特别是针对此类的单元测试时按预期工作。

在对其他类进行测试时,我部分地模拟了这个对象,但仍然需要获取包标识符的方法才能运行。

我看到的是在将对象实例传递给 + [OCMockObject partialMockForObject:] 之前看起来正确:
(lldb) po myObject
<MyObject: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Users/paynerc/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug/MyTests Tests.xctest> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
com.paynerc.MyBundle

然而,在我通过 myObject 之后进入 [OCMockObject partialMockForObject:myObject] , 事情会改变的:
(lldb) po myObject
<MyObject-0x1006ec480-401894396.880136: 0x1006ec480>
(lldb) po [NSBundle bundleForClass:[myObject class]]
NSBundle </Applications/Xcode.app/Contents/Developer/usr/bin> (loaded)
(lldb) po [[NSBundle bundleForClass:[myObject class]] bundleIdentifier]
nil

对象被修改并包含部分模拟魔术的事实是有道理的。似乎没有意义的是为什么调用 bundleForClass改变了它返回的内容。

我能做些什么来确保 bundleForClass继续返回原始值,没有模拟 MyObject 中的调用?令人担忧的是,任何其他需要在另一个单元测试中部分模拟 MyObject 的人都需要记住提供 bundleForClass 的 stub 实现。 .

我目前的解决方案是请求捆绑标识符并检查结果。如果它是零,我调用 [NSBundle allBundles]并遍历它们,直到我找到一个具有非零 bundleIdentifier 的。虽然目前......有效......它是A)不是很强大B)可怕的蛮力和C)修改应用程序代码以支持单元测试。

有没有其他人遇到过这个并提出更好的解决方案?

最佳答案

运行时行为正确。模拟对象是 NSProxy 的子类,因此是对象的 isa 之间的运行时绑定(bind)。并且捆绑包被有效破坏(特别是,isa 指向 Class,然后通过 dyld API 查找它以确定从中加载它并用于查找捆绑包的 mach-o 图像)。
OCMockObject 上可能有 API代理(或子类 OCPartialMockObject )允许您检索原始类。当然,您必须使用它,这意味着您将使用仅应在测试中使用的模拟调用污染您的代码。

或者,在您的 bundle/framework/whatever 返回该类的 bundle 中的一个类上实现一个类方法。这不应该被 mock 。

关于objective-c - 调用 + [NSBundle bundleForClass :] on a partially mocked object is returning a different result than the unmocked object?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19030194/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com