0

私は 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
4

1 に答える 1

0

これを再現できません。これはあなたがしていることですか?

@interface Bar : NSObject <CBPeripheralDelegate>
@property (nonatomic, strong) CBPeripheral *peripheral;
- (void)peripheralTest;
@end

- (void)peripheralTest
{
    NSAssert(_peripheral.delegate == self, @"Empty device");
}

// In test class:    
- (void)testPeripheral
{
    Bar *bar = [Bar new];
    id peripheralMock = [OCMockObject mockForClass:CBPeripheral.class];
    [[[peripheralMock stub] andReturn:bar] delegate];
    bar.peripheral = peripheralMock;
    [bar peripheralTest];
}

このテストは合格です。

于 2013-08-30T17:18:49.617 に答える