伪造 1.0.0

伪造 1.0.0

测试测试
语言语言 Obj-CObjective C
许可证 MIT
发布最后发布2016年9月

Orta TheroxAsh Furrow 维护。



伪造 1.0.0

Circle CI Forgeries Logo

伪造是一个库,使得测试 iOS 应用程序变得更加容易。UIKit 在生产代码中有很多限制,但在测试时这些限制会使测试变得困难。伪造解决了这个问题。

用法

目前,此库提供以下测试替换

这些可以与 依赖注入 一起使用,或者通过使用 OCMock 替换全局单例。

手势识别器

以下为 Forgeries 手势识别器的子类。

  • ForgeryTapGestureRecognizer
  • ForgeryPinchGestureRecognizer
  • ForgeryRotationGestureRecognizer
  • ForgerySwipeGestureRecognizer
  • ForgeryPanGestureRecognizer
  • ForgeryScreenEdgeGestureRecognizer
  • ForgeryLongPressGestureRecognizer

这些子类跟踪它们调用目标动作的次数;提供一个方便的接口到 UIGestureRecognizer

@interface UIGestureRecognizer (Forgeries)

- (void)invoke;

@end

用户默认值

ForgeriesUserDefaults 是一个类,它的 API 与 NSUserDefaults 兼容。它有几个额外的工具,使它在测试中非常有用

  • 快速 API [ForgeriesUserDefaults defaults:@{}],用于从字典中设置默认值
  • 用于检查 lastSetKeylastRequestedKey 和它是否已通过 hasSyncronised 同步的 API
  • 提供一个索引界面,您可以轻松地编辑默认实例
  • 当在测试目标中可用 OCMock 时,可以替换 [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 的子类,它不支持的功能将引发异常。帮助我们添加更多功能。
  • 当测试目标中可用OCMock时,可以替换[NSFileManager defaultManager]

特性集合

您可以模拟UIViewUIViewController的特性集合,这是我们当前支持的两种UITraitEnvironments

[subject stubHorizontalSizeClass:UIUserInterfaceSizeClassRegular];

UIApplication

这里没有什么特殊情况,您可以创建一个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文件。