首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kiwi规范中的辅助函数

Kiwi规范中的辅助函数
EN

Stack Overflow用户
提问于 2012-06-25 22:42:24
回答 3查看 2.8K关注 0票数 14

我有一些重复的规格,我想干涸。通用功能不适合移动到beforeEach块中。本质上,它是对象创建,是12个对象中每个对象的4行,我想将这4行转换为一个函数调用。

在Kiwi规范中,我可以将助手函数放在哪里?

在RSpec中,我可以将def放在规范块之间,但在这里似乎不可能。我甚至尝试过跳过SPEC_END宏并自己添加该内容,这样我就可以从SPEC_BEGIN中添加@实现中的函数,但这似乎也不起作用。

校正..。我可以用手工编码SPEC_END宏来管理类似的工作。我把结局搞错了。但是,它还是失败了,因为该方法不在@interface中。

EN

回答 3

Stack Overflow用户

发布于 2012-08-03 18:09:36

将助手函数创建为SPEC_BEGIN之后的块:

代码语言:javascript
复制
SPEC_BEGIN(MySpec) 

NSDate* (^dateFromString) (NSString *) = ^NSDate* (NSString *dateString) {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    [dateFormatter setDateFormat:@"MM-dd-yyyy"];
    return [dateFormatter dateFromString:dateString];
};


describe(@"something", ^{
    NSDate *checkDate = dateFromString(@"12-01-2005");

...
});

SPEC_END
票数 34
EN

Stack Overflow用户

发布于 2012-12-21 20:59:11

您还可以在SPEC_BEGIN()作用域之上创建一个直接的C函数。

代码语言:javascript
复制
NSString *makeAString () {
    return @"A String";
}

或者,如果您有将跨多个Spec文件使用的助手函数,请将这些函数放在单独的文件中并导入标头。我发现这是一个很好的方法来清理我的规格。

票数 8
EN

Stack Overflow用户

发布于 2014-11-27 10:00:37

超级马林建议采用以下方法:

代码语言:javascript
复制
@implementation KWSpec(Additions)

+ (void)myHelperMethod:(Car*)car {
            [[car shouldNot] beNil];
        };

@end

SPEC_BEGIN(FooBarSpec)

describe(@"A newly manufactured car", ^{
    it(@"should not be nil", ^{
        [self myHelperMethod:[CarFactory makeNewCar]];
    });
});

SPEC_END

另一个选项是道格建议

代码语言:javascript
复制
SPEC_BEGIN(FooBarSpec)

void (^myHelperMethod)(Car*) = ^(Car* car){
        [[car shouldNot] beNil];
    };

describe(@"A newly manufactured car", ^{
    it(@"should not be nil", ^{
        myHelperMethod([CarFactory makeNewCar]);
    });
});

SPEC_END

它的好处是它很适合异步场景:

代码语言:javascript
复制
SPEC_BEGIN(FooBarSpec)

__block BOOL updated = NO;

void (^myHelperAsync)() = ^()
{
    [[expectFutureValue(theValue(updated)) shouldEventually] beYes];
};

describe(@"The updater", ^{
    it(@"should eventually update", ^{
         [[NSNotificationCenter defaultCenter] addObserverForName:"updated" 
                                                 object:nil 
                                                 queue:nil 
                                            usingBlock:^(NSNotification *notification)
         {
             updated = YES;
         }];
         [Updater startUpdating];
         myHelperAsync();
    });
});

SPEC_END

最后,如果您的助手方法驻留在另一个类中,甘田建议进行一次巧妙的攻击:

代码语言:javascript
复制
@interface MyHelperClass

+(void)externalHelperMethod:(id)testCase forCar:(Car*)car
{
    void (^externalHelperMethodBlock)() = ^(){
        id self = testCase; //needed for Kiwi expectations to work
        [[car shouldNot] beNil];
    };
    externalHelperMethodBlock();
}

@end

SPEC_BEGIN(FooBarSpec)

describe(@"A newly manufactured car", ^{
    it(@"should not be nil", ^{
        [MyHelperClass externalHelperMethod:self forCar:[CarFactory makeNewCar]];
    });
});

SPEC_END
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11198428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档