- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试测试一些使用 AVAudioSession
的代码,并且我尝试模拟它,因为它是一个单例,到目前为止证明是困难的,我做了一些研究并想到了这个想法调配它的方式是它的实例,然后按照您的意愿实际初始化您的子类,但我无法弄清楚要调配的方法。我尝试了 sharedInstance 并且 class_addMethod()
返回 yes 表示它已添加而不是替换它。我可以通过这种方式有效地模拟单例吗?
@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
就像这样
@interface AVAudioSessionFake : AVAudioSession
@property (readonly, nonatomic) BOOL wasSetActiveErrorCalled;
@end
@implementation AVAudioSessionFake
-(instancetype)init
{
if (self == [super init]) {
// your init code
}
return self;
}
-(BOOL)setActive:(BOOL)active error:(NSError *__autoreleasing *)outError
{
_wasSetActiveErrorCalled = YES;
return [super setActive:active error:outError];
}
@end
static Method original_AVAudioSession_SharedInstance_ClassMethod;
static Method swizzled_AVAudioSession_SharedInstance_ClassMethod;
@interface AVAudioSession (AVAudioSessionSwizzledSharedInstance)
@end
@implementation AVAudioSession (AVAudioSessionSwizzledSharedInstance)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^
{
Class class = object_getClass((id)self);
SEL original_Selector = @selector(sharedInstance);
SEL swizzled_Selector = @selector(swizzled_sharedInstance);
original_AVAudioSession_SharedInstance_ClassMethod = class_getInstanceMethod(class, original_Selector);
swizzled_AVAudioSession_SharedInstance_ClassMethod = class_getInstanceMethod(class, swizzled_Selector);
});
}
+ (void)swizzling_AVAudioSession_SharedInstance
{
method_exchangeImplementations(original_AVAudioSession_SharedInstance_ClassMethod,swizzled_AVAudioSession_SharedInstance_ClassMethod);
}
+ (id)swizzled_sharedInstance
{
static dispatch_once_t p = 0;
// initialize sharedObject as nil (first call only)
__strong static AVAudioSessionFake _sharedObject = nil;
dispatch_once(&p, ^{
_sharedObject = [[AVAudioSessionFake alloc] init];
});
return _sharedObject;
}
- (void)testAnAVAudioSessionMethod {
[AVAudioSession swizzling_AVAudioSession_SharedInstance]; //Start swizzling shareInstance method
// some test code and assert result here
[AVAudioSession swizzling_AVAudioSession_SharedInstance]; //return original method
}
一些有用的链接 The Right Way to Swizzle in Objective-C , method swizzling , another question in SO
关于ios - 单元测试单例 : mock and swizzle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29689282/
我们在 Objective-C 中使用 Swizzling。为方便起见,我们使用 CoconutKit 的辅助方法来实现此目的: HLSSwizzleSelectorWithBlock_Begin([
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
如果我在我的 iOS 应用程序中添加 2 个 SDK,它在内部为相同的方法“ViewDidAppear”进行方法调配,那么在运行时可能会发生什么(好的 + 坏的)。 最佳答案 根据 swizzling
我正在开发一个 iOS 框架,需要编写一个 swizzling 方法(用于 UIViewController 中的 viewDidAppear 方法)。 我的 swizzling 方法在我的应用程序中
Swizzling 不执行动态方法交换。这是我使用的代码。我听说这是一个无法在 xcode 7 中的 XCTest 中进行依赖注入(inject)的解决方案。你能给我解释一下 DI(依赖)上的 Swi
我正在构建一个带有电话号码登录的屏幕。我一遍又一遍地检查,该项目是新创建的,但是,我收到了以下日志: 7.2.0 - [Firebase/Auth][I-AUT000015] The UIApplic
我有一个主应用程序,我们称之为应用程序。 它链接两个静态库:StatLib1 和 StatLib2。 StatLib1 链接 StatLib2 库。 如您所见,StatLib2 库链接了两次。 在St
我目前正在尝试测试一些使用 AVAudioSession 的代码,并且我尝试模拟它,因为它是一个单例,到目前为止证明是困难的,我做了一些研究并想到了这个想法调配它的方式是它的实例,然后按照您的意愿实际
我的应用程序的一个 viewController 变得非常大,特别是因为我添加了一个“教程状态”,它为我通过检查控制的此类的许多方法添加了不同的实现 _tutorialEnabled? 所以,我的问题
我正在关注这个 article更好地理解方法调配的工作原理。我有这样的主视图 Controller (这是一个新项目): #import "GLViewController.h" #import @
我有很多类,在类内部定义了很多方法。当这些方法中的每一个被调用时,我需要执行一组特定的操作。我可以在每个方法中编写一组操作。但我不想弄乱代码。所以我创建了一个帮助程序类,我将在其中传递一组类和选择器。
我正在尝试更改应用程序语言并使用 Swizzling 函数,但在调用 DoTheSwizzling() 时出现问题,选择器崩溃了!我认为找不到“specialLocalizedStringForKey
我们正在开发一款可以将大量内容保存到 Core Data 中的应用程序。它保存的东西主要是NSDate NSNumber & NSString 但它也将很多图片和视频保存为NSData。我正在尝试更改
我正在尝试通过创建 UIResponder 扩展来调整 UITouch 生命周期事件。以下是描述 touchesBegan 实现的摘录。 public extension UIResponder {
您好,我正在实现 FCM(基于 Fire 的云消息传递)。我已经让应用程序接收来自 FCM 控制台的通知和数据。我有我的服务器通知和 firebase 通知。我想分别处理两种类型的通知(来 self
我最近收到了一个私有(private)硬件 SDK,可以集成到我公司的移动应用程序中。一切都很好,除了他们使用的是 UIAlertView作为一些不透明方法调用的结果,我的设计团队想要标记它。我无权访
我正在尝试调整 UIView 上的 backgroundColor 属性。 在我调酒之前,我执行以下操作: @implementation UIView (Cat1) +(void)load { NS
我正在尝试搜索以防止在我当前的库中使用 Method Swizzle,但我发现的每篇文档或博客文章或多或少都是关于如何实现 Swizzling 的。我有几个关于 Method swizzling 的问
我已经尝试使用 Swizzle Stream 库来替换输入流中的标记。 String RESOURCE_PATH = "FakePom.xml"; InputStream pomIS = Ja
我正在使用以下代码在 C++ 中的 opengl 中实现“缩放到鼠标点”功能。大部分代码来自 OpenGL Google maps style 2D camera / zoom to mouse cu
我是一名优秀的程序员,十分优秀!