ライブラリ Kiwi を使用して単体テストを行いたいと思います (PMKPromise) を使用するメソッドがあります。
私の方法は次のようになります。
- (void)fetchData {
[PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject) {
// make the request
}].then(^(NSDictionary *data){
// code that I'd like to test
});
}
promise 完了ブロック (「then」と呼ばれる) をキャプチャして実行したいのですが、この方法で (モックされた promise を使用して) 実行することができました。
// 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
残念ながら、このコードは機能しません。足を踏み入れると、確かにブロックがキャプチャされます。しかし、キャプチャされたブロックを実行する瞬間には、それは nil です。