我想知道是否有一种使用 OCMock 的方法可以分别调用一个类方法两次,就像应用程序运行两次一样,但实际上只运行一次。
我想测试一个类方法。由于方法内部存在一些静态变量,因此该方法一旦被调用就会一直保持其行为。因此,我无法同时测试不同的行为。
当然,如果目的只是为了测试,我不能在课程中添加任何其他内容。
我想知道是否有一种使用 OCMock 的方法可以分别调用一个类方法两次,就像应用程序运行两次一样,但实际上只运行一次。
我想测试一个类方法。由于方法内部存在一些静态变量,因此该方法一旦被调用就会一直保持其行为。因此,我无法同时测试不同的行为。
当然,如果目的只是为了测试,我不能在课程中添加任何其他内容。
没有办法在不通过 Objective-C 方法公开它们的情况下使用 OCMock 更改静态声明的变量。您说“当然”,您不能仅出于测试目的在课程中添加任何内容,但这并未被普遍接受。有一个完整的学派认为你的代码本身应该被设计成可以测试的。
- (NSInteger)someStatic
{
static NSInteger _someStatic = 42;
return _someStatic;
}
如果您使用这样的模式(例如,可能有更好的模式),您可以模拟您的静态。虽然这会在使用静态的任何地方添加方法调用,但您可能会发现进行全面测试更为重要。
OCMock 2.1 版支持模拟类方法:
OCMock 2.1 发布
2013 年 3 月 15 日新版本 (2.1) 增加了对存根类方法的支持,并包括许多贡献的错误修复。此版本与 Xcode 4.5/4.6 兼容。
他们网站上的“功能”页面提供了一些关于如何模拟类方法的示例:
类方法
[[[mock stub] andReturn:aValue] someClassMethod]
告诉模拟对象,当在创建模拟对象的类上调用 someClassMethod 时,它应该返回 aValue。这与用于存根实例方法的语法相同。
如果一个类方法应该被存根,但该类也有一个与类方法同名的实例方法,那么模拟类方法的意图必须明确:
[[[[mock stub] classMethod] andReturn:aValue] aMethod]
该类可以返回到其原始状态,即所有存根都将被删除:
[mock stopMocking]
只有在测试结束前必须恢复原始状态时才需要这样做。模拟在其自己的释放期间自动调用 stopMocking。注意:如果添加了存根类方法的模拟对象没有被释放,存根方法将在测试中持续存在。如果多个模拟对象同时操作同一个类,则行为未定义。