我正在尝试对我们的收据验证服务器进行单元测试,尽管我可以更改内部API来避免此问题,但这意味着我们没有完全测试客户端API,因此我想避免这种情况。

作为API的一部分,我们通过SKPaymentTransaction,然后将Transaction.transactionReceipt传递到我们的服务器。

为了正确测试,我想创建一个SKPaymentTransaction实例,该实例具有我选择的transactionReceipt(有效值和无效值)。

不幸的是,由于this,SKPaymentTransaction将transactionReceipt属性定义为只读,并且我无法声明将其定义为可读写的扩展/子类。

我也似乎无法将SKPaymentTransaction指针强制转换为char *以手动将值插入内存,因为Xcode在ARC中不允许这样做。

有谁知道我如何实现自己的目标?

谢谢
背风处

最佳答案

事实证明,我可以解决transactionReceipt getter来将自己的数据注入到调用中。

所以我最终得到类似

-(void)test_function
{
    SKPaymentTransaction* invalidTransaction = [[SKPaymentTransaction alloc] init];

    Method swizzledMethod = class_getInstanceMethod([self class], @selector(replaced_getTransactionReceipt));
    Method originalMethod = class_getInstanceMethod([invalidTransaction class], @selector(transactionReceipt));

    method_exchangeImplementations(originalMethod, swizzledMethod);

    // Call to receipt verification server
}

- (NSData*)replaced_getTransactionReceipt
{
    return [@"blah" dataUsingEncoding:NSUTF8StringEncoding];
}

我写了一篇博客文章,展示了我的过程,并在此处提供了更多详细信息。
http://engineering-game-dev.com/2014/07/23/injecting-data-into-obj-c-readonly-properties/

09-25 16:25