OCMock 和 UIViewController

Posted

技术标签:

【中文标题】OCMock 和 UIViewController【英文标题】:OCMock and UIViewController 【发布时间】:2015-11-16 21:02:03 【问题描述】:

我目前正在研究如何有效地将一些单元测试添加到我的应用的 ViewControllers。到目前为止,它工作得很好,直到我尝试让特定的视图控制器呈现另一个视图控制器。

我正在使用 OCMock 和 XCTest。测试如下

id partialMock = OCMPartialMock([TestViewController class]);
[partialMock doSomeStuff];
OCMVerify([partialMock presentViewController:[OCMArg any] animated:[OCMArg any] completion:[OCMArg any]]);

如您所见,我只想验证 presentViewController 是否被调用到 doSomeStuff 函数内的测试视图控制器。请注意,给定的示例是我目前拥有的简化版本。主要区别在于我正在验证参数 viewController 是另一个模拟对象。

问题是因为doSomeStuff 方法没有被存根,然后调用被转发到真正的TestViewController 实例,然后它自己调用presentViewController,然后不触发partialMock 的验证。

我有什么遗漏吗?还是我想要实现的目标真的无法实现?

【问题讨论】:

嗨,Marc,我可能在这里错了,但是您正在对类对象设置部分模拟。通常,要设置一个常规的模拟对象,您使用该类,但对于部分模拟对象,您应该从您想要“监视”的对象设置它,在这种情况下,您的 viewController 哦,你是对的,事实上我的简化示例并不完全正确。因为我实际上有两个视图控制器,但这让我想到了一些事情。 【参考方案1】:

您可以使用 andDo(nil) 来存根您想要抑制的方法,如 2.10 中所述:http://ocmock.org/reference/

【讨论】:

有没有办法在类的每个实例上存根该方法?我的感觉是否定的,因为该方法是从 TestViewController 类本身调用的,所以它确实使用了存根方法。我不确定我是否 100% 清楚我的问题是什么 有效....我不知道之前出了什么问题,我认为这与使我的验证失败的动画有关:[OCMArg any]

以上是关于OCMock 和 UIViewController的主要内容,如果未能解决你的问题,请参考以下文章

GHUnit,OCMock:如何测试两个指定块之一是不是被调用?

用于本地实例化和作用域变量的 OCUnit 或 OCmock 测试方法。

OCMock 3 Partial Mock:类方法和 objc 运行时

xcode 中的单元测试(使用 GHUnit 和 OCMock)

OCMock:存根 @dynamic 属性

OCMock - 试图模拟 NSEntityDescription