FactoryBird 0.0.2

FactoryBird 0.0.2

测试已测试
语言语言 Obj-CObjective C
许可 MIT
发布最新版本2015 年 3 月

Maria Bernis 维护。



FactoryBird 是一个 Objective-C 库,可以轻松创建一组用于 Objective-C 单元测试的假模型固定装置。它允许您轻松配置并创建具有假数据的对象,您可以在测试中使用这些对象以实现隔离的已知状态。

听起来像 FactoryGirl

这是因为 Objective-C 的 FactoryBird 是基于 Ruby 的 factory_girl 功能构建的。

它主要受 Foundry 的启发,但它增加了一些额外的 灵活性

  • 您可以通过调用 build 创建默认测试对象,或者通过传递一个字典作为属性并在其中提供默认属性的山姆,调用 buildUsing:
  • 您可以构建对象的 数组 并覆盖所有对象或某些对象的某些属性,所有这些都在一个单独的方法中。
  • 它与 faker 库/逻辑解耦。在实现 FactoryBirdObject 协议时,您可以使用喜欢的任何 faker pod。我在使用 Gizou
  • 可以与子类的继承属性一起工作;例如,对于给定的对象,您可以设置其任何超类的属性。
  • 允许对 NSObject 和 NSManagedObject 工厂进行子类化,以使其具有同一个对象的几个方便的配置。无论实体是否在 xcdatamodel 中,当使用 Core Data 时也是如此。

安装

CocoaPods.

pod 'FactoryBird', '~> 0.0.1'

设置测试环境

  1. 将 FactoryBird 添加到您的测试目标中,以及所有您想使用它的目标。例如 单元测试和快照测试

  2. 清洁提示:在测试目标的文件夹同一级别下创建一个单独的 Factories/ 文件夹,该文件夹将保存对象工厂。

    Tests/
        Factories/
        UnitTests/
        SnapshotTests/

如果使用 Core Data,将 NSManagedObject 与常规 NSObject 分开是一个好主意。

    Tests/
        Factories/
            CoreData/
            Ponsos/
        UnitTests/
        SnapshotTests/


定义工厂

定义对象的工厂只是使其类符合 <FactoryBirdObject> 协议。

#import "FactoryBird.h"

@interface Task <FactoryBirdObject>

只有一个方法要实现

+ (NSDictionary *)factoryAttributes

在这里,您创建一个假对象所需的属性键-值对字典。

+ (NSDictionary *)factoryAttributes
{
    return @{ @"title"       : @"Title for testing",
              @"dueOn"       : [NSDate dateWithTimeIntervalSince1970:1425314661],
              @"resolved"    : @NO,
              @"taskID"     : @1,
              @"description": @"Lorem ipsum dolor est"
              };
}

键可以是类或其超类中的任何 属性。在 NSManagedObject 的情况下,属性关系(因为它们是 属性)。

在 Tests 目标中创建单独的分类

当您需要一个模型的工厂时,您可以让模型类直接遵从 <FactoryBirdObject> 协议。

但是,您也可以不改变类,在 Factories/ 文件夹内为测试目标/s 添加一个新的类别。这样,您可以保持您的模型代码整洁,并且工厂方法只能在真正的测试目标内部使用 :wink:

    Tests/
        Factories/
            Task+FactoryBird.h
            Task+FactoryBird.m
        UnitTests/
        SnapshotTests/

Task+FactoryBird.h 头文件

#import "FactoryBird.h"

@interface Task (FactoryBird) <FactoryBirdObject>

@end

使用工厂

创建工厂后,在测试中使用它非常简单。

创建对象
Task *task = [Task build];
创建对象(重写或添加某些属性)
Task *resolvedTask = [Task buildUsing:@{@"resolved":@YES}];

您传递的字典将根据工厂是否定义或重写这些属性,将属性添加到 Task 对象中。

连续创建多个对象
NSArray *tasks = [Task buildTimes:@20];
传递特定属性创建多个对象
NSArray *tasksWithProjects = [Task buildTimes:@20 using:^NSDictionary *(NSUInteger idx) {
        return @{@"project": [Project build]};
    }];

对于受管理对象,只需传递一个有效的上下文

User *user = [User buildWithContext:context];
User *maria = [User buildWithContext:context using:@{@"name":@"Maria"}];