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