我有一个使用promises的方法(PMKPromise),我想使用库Kiwi进行单元测试。
我的方法如下:
- (void)fetchData {
[PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject) {
// make the request
}].then(^(NSDictionary *data){
// code that I'd like to test
});
}
我想捕获并执行promise完成块(称为“then”),我设法以这种方式(使用模拟的承诺):
// capture the promise completion block
__block void (^capturedBlock)(NSDictionary *);
[thePromise stub:@selector(then) withBlock:^id(NSArray *params) {
return ^(id block){
capturedBlock = block;
return nil;
};
}];
[myObj fetchData];
// execute the block
capturedBlock(@{});
我现在要做的是将这个丑陋的代码隐藏在我将来可以轻松使用的类别中进行单元测试。
我想传递一个块“双指针”作为方法参数。
这可能是实施:
@interface NSObject (PMKPromiseTest)
- (void)captureThenBlock:(void (^ *)(NSDictionary *))capturedBlock;
@end
@implementation NSObject (PMKPromiseTest)
- (void)captureThenBlock:(void (^ *)(NSDictionary *))capturedBlock {
[self stub:@selector(then) withBlock:^id(NSArray *params) {
return ^(id block){
*capturedBlock = block;
return nil;
};
}];
}
@end
这就是我如何使用它:
// capture the promise completion block:
void (^capturedBlock)(NSDictionary *);
[thePromise captureThenBlock:&capturedBlock];
[myObj fetchData];
// execute it
capturedBlock(@{}); // Exception! captureBlock is nil
不幸的是这段代码不起作用。踩到时,确实捕获了该块。但是一旦出局,在执行捕获的块时,它就是零。