Testando Singletons em iOS com Kiwi

Um problema recente que encontrei enquanto estava começando a usar o BDD e o Kiwi no iOS foi testar singletons. Por natureza, os singletons são objetos estáticos, eles não deveriam, pois são “instanciados”, em vez disso, eles retornam uma cópia já ativa de si mesmos para mutação. Isso era um problema ao executar vários testes em que você queria que o singleton fosse “fresco” ou novo entre cada teste.

#import "VVSomethingGood.h"

@implementation VVSomethingGood

static VVSomethingGood *_sharedInstance = nil;
static dispatch_once_t onceToken;

+ (instancetype)sharedInstance {
dispatch_once
(&onceToken, ^{
if (_sharedInstance == nil) {
_sharedInstance
= [[VVSomethingGood alloc] init];
}
});
return _sharedInstance;
}

Em seguida, o método mágico para redefinir o singleton de volta a um estado em que sharedInstance seria recriado por meio do método de classe sharedInstance:

//A hook to override singleton, useful for testing
+(void)setSharedInstance:(VVSomethingGood *)instance {
onceToken
= 0; // resets the once_token so dispatch_once will run again
_sharedInstance
= instance;
}

Então, em meus testes de Kiwi, tenho

[VVSomethingGood setSharedInstance:nil];

Onde eu quero que meus testes sejam reiniciados