伪造是一个库,使得测试 iOS 应用程序变得更加容易。UIKit 在生产代码中有很多限制,但在测试时这些限制会使测试变得困难。伪造解决了这个问题。
目前,此库提供以下测试替换
这些可以与 依赖注入 一起使用,或者通过使用 OCMock 替换全局单例。
以下为 Forgeries 手势识别器的子类。
这些子类跟踪它们调用目标动作的次数;提供一个方便的接口到 UIGestureRecognizer
@interface UIGestureRecognizer (Forgeries)
- (void)invoke;
@end
ForgeriesUserDefaults
是一个类,它的 API 与 NSUserDefaults 兼容。它有几个额外的工具,使它在测试中非常有用
[ForgeriesUserDefaults defaults:@{}]
,用于从字典中设置默认值lastSetKey
、lastRequestedKey
和它是否已通过 hasSyncronised
同步的 API[NSUserDefaults standardUserDefaults]
请注意,这个类还不是 NSUserDefaults 的子类,因此不能被 DI 添加到 Swift 类。
ForgeriesFileManager
仍然很新,因此它的 API 相对有限,因为我们找到了更多用例。
一个快速 API,用于从字典中设置默认值
ForgeriesFileManager *fm = [ForgeriesFileManager withFileStringMap:@{
@"/docs/EchoTest.json" : @{ @"updated_at" : @"2001-01-23" },
@"/app/EchoTest.json": @{ @"updated_at" : @"1985-01-23" },
@"/docs/VERSION" : @"1.0.1"
}];
此 API 将自动将字典转换为原始 JSON 数据或让您创建带有文本的文件
[NSFileManager defaultManager]
。您可以模拟UIView
和UIViewController
的特性集合,这是我们当前支持的两种UITraitEnvironments
。
[subject stubHorizontalSizeClass:UIUserInterfaceSizeClassRegular];
这里没有什么特殊情况,您可以创建一个ForgeriesApplication
,它是UIApplication的子类,用于DI测试。
使用Forgeries的技巧是只在测试中使用。一种很好的方法是使用依赖注入。这意味着将依赖注入到实例中,而不是让该实例自己创建依赖项,或者访问共享状态。让我们来看一个例子。
假设你正在测试MyViewController
,你会为你的人工智能使用懒加载。
@interface MyViewController ()
@property (nonatomic, strong) UITapGestureRecognizer *recognizer;
@end
@implementation MyViewController
...
- (UITapGestureRecognizer *)recognizer {
if (_recognizer == nil) {
_recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleGestureRecognizer:)];
}
return _recognizer;
}
...
我们需要做的是在懒加载之前设置那个属性。以下是我们的测试代码
MyViewController *subject = /* Instantiate somehow */
ForgeryTapGestureRecognizer *recognizer = [[ForgeryTapGestureRecognizer alloc] initWithTarget:subject action:@selector(handleGestureRecognizer:)];
subject.recognizer = recognizer;
/* Optionally, set the testing_location and testing_velocity properties on recognizer. */
[recognizer invoke];
expect(subject).to( /* have done something, whatever it is you're testing for */ );
如果你对依赖注入感兴趣,我们强烈推荐观看Jon Reid的这个演讲
需要iOS 7或更高版本。
可以通过CocoaPods安装Forgeries。要安装它,只需将以下行添加到Podfile中的unit testing目标下
target 'MyApp_Tests' do
inherit! :search_paths
pod 'Forgeries'
...
end
这将导入核心功能,不包括模拟功能。如果您要使用OCMock与Forgeries,请使用以下内容替代
pod 'Forgeries/Mocks'
现在在单元测试中导入库。
import Forgeries
@import Forgeries;
// or #import <Forgeries/Forgeries.h>
Forgeries在MIT许可下提供。有关更多信息,请参阅LICENSE文件。