В настоящее время я пытаюсь проверить код, который использует AVAudioSession
, и мои попытки издеваться над ним, так как это синглтон, пока оказались трудными, и я сделал немного исследований и наткнулся на эту идею для того чтобы swizzly, как это получить, это экземпляр, чтобы фактически инициализировать ваш подкласс так, как вам бы хотелось, но у меня возникли проблемы с выяснением, какие методы для swizzle. Я попробовал sharedInstance, и class_addMethod()
возвращает «Да», говоря, что он добавлен, а не заменяет его. Могу ли я эффективно высмеивать синглтон таким образом?Единичное тестирование singleton: mock and swizzle
@interface AVAudioSessionFake : AVAudioSession
@property (readonly, nonatomic) BOOL wasSetActiveErrorCalled;
-(instancetype)initStub;
@end
@implementation AVAudioSessionFake
+ (void)load
{
[AVAudioSessionFake swizzleOriginalMethod:@"sharedInstance" with:@"initStub"];
}
+ (void)swizzleOriginalMethod:(NSString*)Original with:(NSString*)replacement
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^
{
Class class = [self class];
SEL originalSelector = NSSelectorFromString(Original);
SEL swizzledSelector = NSSelectorFromString(replacement);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL didAddMethod =
class_addMethod(class,
originalSelector,
method_getImplementation(swizzledMethod),
method_getTypeEncoding(swizzledMethod));
if (didAddMethod)
{
class_replaceMethod(class,
swizzledSelector,
method_getImplementation(originalMethod),
method_getTypeEncoding(originalMethod));
}
else
{
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
-(instancetype)initStub
{
return [[[self class]alloc]init];
}
- (BOOL)setActive:(BOOL)active error:(NSError *__autoreleasing *)outError
{
_wasSetActiveErrorCalled = YES;
return [super setActive:active error:outError];
}
@end
Вы хотите окурок 'метода sharedInstance', чтобы вернуть' AVAudioSessionFake', верно? –
Не в конечном счете, пока я могу создать экземпляр 'AVAudioSessionFake', будучи подклассом' AVAudioSession', поэтому я могу проверить, что некоторые методы вызываются, когда они должны. если stubbing sharedInstance достигает уверенности в этом, что я хочу. – Genhain