我已经在我的规范文件中的BEGIN_SPEC
END_SPEC
块中定义了一些辅助块,我经常重复使用。例如。断言某个对话框显示出来:
void (^expectOkAlert) (NSString *, NSString *) = ^void(NSString *expectedTitle, NSString *expectedMessage) {
UIAlertView *alertView = [UIAlertView mock];
[UIAlertView stub:@selector(alloc) andReturn:alertView];
[[alertView should] receive:@selector(initWithTitle:message:delegate:cancelButtonTitle:otherButtonTitles:)
andReturn:alertView
withArguments:expectedTitle,expectedMessage,any(),@"OK",any()];
[[alertView should] receive:@selector(show)];
};
我想将此块重用于其他几个spec文件。这是不可能的,就像我们通常在Ruby世界中使用spec helper和rspec一样?
您如何管理全球规范助手?
答案 0 :(得分:2)
你可以
将expectOkAlert
声明为全局变量,在其他单元测试中包含的公共头中
extern void (^expectOkAlert) (NSString *, NSString *);
或在expectOkAlert
类别中声明KWSpec
,您仍然需要一个包含在您需要使用它的单元测试中的公共标题
@implementation KWSpec(Additions)
+ (void)expectOkAlertWithTitle:(NSString*)title andMessage:(NSString*)message;
@end
你可以这样使用它:
it(@"expects the alert", %{
[self expectOkAlertWithTitle:@"a title" andMessage:@"a message"];
});
或创建自定义匹配器并使用它来断言:
@interface MyAlertMatcher: KWMatcher
- (void)showOKAlertWithTitle:(NSString*)title andMessage:(NSString*)message;
@end
并在你的测试中使用它:
it(@"expects the alert", %{
[[UIAlertView should] showOkAlertWithTitle:@"a title" andMessage:@"a message"];
});
所有方法都要求您在单元测试目标可用标头中声明帮助程序,否则您将收到编译警告/错误。