私は CoreBluetooth を使用しているので、単体テストではすべての CB オブジェクトをモックして、必要なものを返すようにしています。私のテストの 1 つで、CBPeripheral をモックし、デリゲート メソッドを次のようにスタブします。
[[[mockPeripheral stub] andReturn:device] delegate];
渡されたデバイスは、周辺機器を保持するラッパー オブジェクトです。テストの後半で、デバイスでメソッドを呼び出し、次をチェックします。
NSAssert(_peripheral.delegate == self, @"Empty device");
_peripheral.delegate != selfであるため、この行はテスト中にアサートされています。
デバッグして、_peripheralが OCMockObject であることを確認しました。アサートが_peripheralのデリゲートをチェックするときに、スタブ化されたメソッドがデバイスを返さないのはなぜですか?
詳細なコードは次のとおりです。
@interface Manager : NSObject
- (void)connectToDevice:(Device*)device;
@end
@implementation Foo
- (void)connectToDevice:(Device*)device {
if([device checkDevice]) {
/** Do Stuff */
}
}
@end
@interface Device : NSObject {
CBPeripheral _peripheral;
}
- (id)initWithPeripheral:(CBPeripheral*)peripheral;
@end
@implementation Device
- (id)initWithPeripheral:(CBPeripheral*)peripheral {
self = [super init];
if(self) {
_peripheral = peripheral;
_peripheral.delegate = self;
}
return self;
}
- (BOOL)checkDevice {
NSAssert(_peripheral.delegate == self, @"Empty device");
return YES;
}
@end
@implementation Test
__block id peripheralMock;
beforeAll(^{
peripheralMock = [OCMockObject mockForClass:[CBPeripheral class]];
});
//TEST METHOD
it(@"should connect", ^{
Device *device = [[Device alloc] initWithPeripheral:peripheralMock];
[[[peripheralMock stub] andReturn:device] delegate];
[manager connectToDevice:device];
}
@end