使用partialMockForObject做单例类mock,如何创建像“removeAllExpectations”这样的方法来删除所有记住的?

Posted

技术标签:

【中文标题】使用partialMockForObject做单例类mock,如何创建像“removeAllExpectations”这样的方法来删除所有记住的?【英文标题】:Using partialMockForObject to do singleton class mock, how to create a method like "removeAllExpectations” to remove all remembered ones? 【发布时间】:2011-12-19 02:26:57 【问题描述】:

对单例的 OCMock 感到困惑,获得两种方法,但在我看来它们都不是完美的。

    使用 partialMockForObject。 我想使用 partialMockForObject 来做单例类模拟。看下面的代码,效果很好,但是缺点是单例 [NSNotificationCenter defaultCenter] 会记住之前的 mock 行为,然后在另一个地方调用时,它会崩溃,出乎意料。所以我的问题是如何创建一个像“removeAllExpectations”这样的方法来删除所有记住的?

    id aMock = [OCMockObject partialMockForObject:[NSNotificationCenter defaultCenter]];

    [aMock 期望] removeObserver:[OCMCConstraint isKindOfClass:[WhereIsMyPhoneViewController 类]]];

    [[模拟验证];

    使用分类方法。见http://twobitlabs.com/2011/02/mocking-singletons-with-ocmock/提到了另一种做单例模拟的方法,我个人更喜欢partialMockForObject,单元测试时不需要模拟所有方法。

已将我的问题发送给 OCMock 开发组,但尚未收到回复,需要各位聪明人的意见。任何想法或讨论将不胜感激,在此先感谢。

【问题讨论】:

我希望这个问题真的得到了回答,因为这正是我想在我的测试中做的。有 1 个逻辑测试,而不是分成 3 个以上的小测试,并在中间重置。 【参考方案1】:

如果您使用的是最新的 OCMock 源代码(之后 2012-04-06), 来电

[aMock stopMocking];

重置模拟对象的状态。

【讨论】:

我没有看到任何 OCMock 标头中引用了 stop 或 stopMocking。 “-[NSProxy doesNotRecognizeSelector:stopMocking] 调用了!”你们确定这些应该有效吗? stopMocking 在 OCMockObject.h 中声明 我再次检查了从ocmock.org/download 下载的最新 2.0.1 框架,但它不存在。但你是对的,如果我查看github.com/erikdoe/ocmock/blob/master/Source/OCMock/… 的源代码,它就在那里。所以我想我必须从源代码编译才能让它工作。感谢您的提醒。【参考方案2】:

您可以致电:

[aMock stop];

重置模拟对象的状态。

【讨论】:

谢谢聪明人,库框架里面的方法真的很管用。 太棒了,我完全被关于部分模拟的不一致异常所困扰,并将其添加到我的 tearDown 方法导致异常/错误消失。谢谢!

以上是关于使用partialMockForObject做单例类mock,如何创建像“removeAllExpectations”这样的方法来删除所有记住的?的主要内容,如果未能解决你的问题,请参考以下文章

目标c单例dispatch_once实现更好?

如何在单例中传递参数

volatile 与 JVM 指令重排序

使用 ServerSocket 建立聊天服务器-2

H2数据库做单测数据库时踩到的坑

使用IDEA开发,做单步调试速度巨慢,何解?