由於您不能通過提供不同的實例來攔截方法,因此您可以爲類方法執行的操作是提供不同的類。事情是這樣的:
+ (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