OKSpecHelper 0.4

OKSpecHelper 0.4

测试已测试
语言语言 Obj-CObjective C
许可证 MIT
发布上次发布2014年12月

未命名 维护。



使用 Objection 为 Kiwi 测试注入模拟的简单助手。尽量不干扰正常的 Objection 和 Kiwi 语法和用法。目前针对 iOS 7 和 XCTest。

安装

要使用 Cocoapods 安装,请在 Podfile 中包含 OKSpecHelper,但仅针对您的测试目标

target :'myTests', :exclusive => true do
  pod 'OKSpecHelper'
end

用法

像平常一样为您的目标设置 Objection。

为将您的类绑定到模拟创建一个 JSObjectionModule。包含 Objection 通常会注入的任何依赖,您在测试中将需要模拟的依赖。

@interface TestInjectionModule : JSObjectionModule
@end

@implementation TestInjectionModule

- (void)configure {
      [self bind:[NSNotificationCenter nullMock] toClass:[NSNotificationCenter class]];
      [...]
}

@end

在每个 spec 中,不要使用 SPEC_BEGIN,而是使用 SPEC_BEGIN_WITH_INJECTION,如下所示。注意第二个参数,它是模拟注入模块的名称。

SPEC_BEGIN_WITH_INJECTION(GBGameSpec, TestInjectionModule)

设置您要测试的东西,并确保调用它的 injectDependencies,因为 Objection 不会为您创建它

SPEC_BEGIN_WITH_INJECTION(GBGameSpec, TestInjectionModule)

        describe(@"GBGame", ^{
            __block GBGame *game;

            beforeEach(^{
                game = [[GBGame alloc] init];
                [game injectDependencies];
            });

            [...]

        });

 SPEC_END

最后,您可以使用 getDependency(<class or protocol>) 获取您的模拟。我通常在 beforeEach 中检索和存储它们

#import "Kiwi.h"
#import "JSObjection.h"
#import "GBGame.h"
#import "OKSpecHelpers.h"
#import "TestInjectionModule.h"
#import "NSObject+OKInjection.h"

SPEC_BEGIN_WITH_INJECTION(GBGameSpec, TestInjectionModule)

        describe(@"GBGame", ^{
            __block GBGame *game;
            __block NSNotificationCenter *notificationCenterMock;

            beforeEach(^{
                notificationCenterMock = getDependency([NSNotificationCenter class]);

                game = [[GBGame alloc] init];
                [game injectDependencies];
            });

            context(@"when foo", ^{

                it(@"should bar", ^{
                    [game arrange];

                    [[notificationCenterMock should] receive:@selector(assert)];

                    [game act];
                });
            });
        });

 SPEC_END

请注意,您的注入模块(以及您的模拟)将在每个测试后重建,不会重复使用,因此您可以将模拟与异步测试(shouldEventually 等)一起使用而不会出现任何问题。