我正在尝试对我们的收据验证服务器进行单元测试,尽管我可以更改内部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/