Question Fonctions d'aide dans les spécifications Kiwi


J'ai quelques spécifications répétitives que j'aimerais sécher. La fonctionnalité commune ne se prête pas à un déplacement beforeEach bloc. Essentiellement, il s’agit de la création d’objets et de 4 lignes pour chacun des 12 objets. Je voudrais transformer ces 4 lignes en un seul appel de fonction.

Où puis-je mettre des fonctions d'aide dans une spécification Kiwi?

En RSpec je peux juste mettre def entre les blocs de spécifications, mais cela ne semble pas être possible ici. J'ai même essayé de sauter le SPEC_END macro et en ajoutant ce contenu moi-même afin que je puisse ajouter des fonctions à l'intérieur de la mise en œuvre de SPEC_BEGIN mais cela ne semble pas fonctionner non plus.

Correction... je peux gérer quelque chose qui fonctionne avec le codage manuel de la SPEC_END macro J'ai eu la fin} mal placée. Mais encore, il échoue, car la méthode n'est pas dans le @interface.


14
2018-06-25 22:42


origine


Réponses:


Créez votre fonction d'assistance en tant que bloc juste après SPEC_BEGIN:

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
2017-08-03 18:09



Vous pouvez également créer une fonction C droite au-dessus du SPEC_BEGIN() portée.

NSString *makeAString () {
    return @"A String";
}

Ou si vous avez des fonctions d'assistance qui seront utilisées dans plusieurs fichiers Spec, placez ces fonctions dans un fichier distinct et importez l'en-tête. J'ai trouvé que c'était un excellent moyen de nettoyer mes spécifications.


8
2017-12-21 20:59



supermarché suggère la méthode suivante:

@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

Une autre option est comme Doug suggère:

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

La bonne chose à ce sujet est qu'il se prête bien aux scénarios asynchrones:

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

Enfin, si votre méthode d'assistance réside dans une autre classe, Gantaa suggère un hack intelligent:

@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
2017-11-27 10:00