使用 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 等)一起使用而不会出现任何问题。