由于您不能通过提供不同的实例来拦截方法,因此您可以为类方法执行的操作是提供不同的类。事情是这样的:
+ (Class)paymentQueueClass
{
return [SKPaymentQueue class];
}
调用点就变成了:
Class paymentQueueClass = [[self class] paymentQueueClass];
if ([paymentQueueClass canMakePayments])
...
这引入了一个“测试缝”,或点控制,允许我们指定比SKPaymentQueue
其他类。现在我们来做一个替换:
static BOOL fakeCanMakePayments;
@interface FakePaymentQueue : SKPaymentQueue
@end
@implementation FakePaymentQueue
+ (void)setFakeCanMakePayments:(BOOL)fakeValue
{
fakeCanMakePayments = fakeValue;
}
+ (BOOL)canMakePayments
{
return fakeCanMakePayments;
}
@end
严格地说,这不是一个“模拟对象” - 它是一个“假对象”。不同之处在于模拟对象验证了它的调用方式。假对象只是提供残留结果。
现在让我们创建一个我们想测试的原始类的测试子类。
@interface TestingSubclass : OriginalClass
@end
@implementation TestingSubclass
+ (Class)paymentQueueClass
{
return [FakePaymentQueue class];
}
@end
所以你看,这取代了SKPaymentQueue
与FakePaymentQueue
。您的测试现在可以针对TestingSubclass
运行。
点吧,笑? (对不起,我无法抗拒) – Abizern