異なるインスタンスを提供することでメソッドをインターセプトすることはできないため、クラスメソッドでできることは別のクラスを提供することです。このような何か:
+ (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
だから、これはFakePaymentQueue
とSKPaymentQueue
を置き換え、参照してください。テストはTestingSubclass
に対して実行できるようになりました。
ポイントと笑う:
は、その後、あなたはその方法を模擬しますか? (申し訳ありませんが、抵抗できませんでした) – Abizern