Sto testando un metodo che chiama -[NSDate date]
e utilizza l'ora di sistema come riferimento per fare qualche logica. Devo verificare se la logica è giusta in alcuni giorni specifici dell'anno, ma non posso aspettare fino a quel giorno. Quindi posso modificare la data di sistema a livello di codice durante il test dell'unità?Cambia la data di sistema per il test dell'unità Cocoa
10
A
risposta
12
È necessario utilizzare Mock object e in Objective C è possibile farlo facilmente con le categorie sostituendo solo i metodi necessari. Per esempio si potrebbe utilizzare la categoria:
// ------------- File: NSDate+NSDateMock.h
@interface NSDate (NSDateMock)
+(void)setMockDate:(NSString *)mockDate;
+(NSDate *) mockCurrentDate;
@end
// -------------- File: NSDate+NSDateMock.m
#import "NSDate+NSDateMock.h"
@implementation NSDate (NSDateMock)
static NSDate *_mockDate;
+(NSDate *)mockCurrentDate
{
return _mockDate;
}
+(void)setMockDate:(NSString *)mockDate
{
_mockDate = [NSDate dateWithString:mockDate];
}
@end
e in aggiunta è necessario SwizzleClassMethod
void SwizzleClassMethod(Class c, SEL orig, SEL new) {
Method origMethod = class_getClassMethod(c, orig);
Method newMethod = class_getClassMethod(c, new);
c = object_getClass((id)c);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
e poi nel vostro unit test si sarà in grado di utilizzare in questo modo
SwizzleClassMethod([NSDate class], @selector(date), @selector(mockCurrentDate));
[NSDate setMockDate:@"2007-03-24 10:45:32 +0200"];
NSLog(@"Date is: %@", [NSDate date]);
Problemi correlati
- 1. Come ottengo la data corrente in Cocoa
- 2. Magento cambia il layout dinamicamente tramite la variabile di sistema
- 3. Broadcast Intent quando la data cambia?
- 4. Cambia la data di sistema del telefono Android sul pulsante clic dall'applicazione Android
- 5. Test unità Interfaccia utente Cocoa
- 6. Cambia il colore del cursore del testo (caret) in Cocoa?
- 7. Cambia colore di un separatore di riga in Cocoa
- 8. Modulo Python per modificare la data e l'ora del sistema
- 9. Test di sistema vs Test di accettazione - Differenza nei test
- 10. Cambia il formato della data laravel 5
- 11. Dove posizionare il "Core Data Stack" in un'applicazione Cocoa/Cocoa Touch
- 12. Cambia carattere di sistema per l'applicazione iPhone - intera applicazione
- 13. Modifica la data di sistema a livello di programmazione
- 14. JavaScript - Ottieni il formato di data breve del sistema
- 15. Previene "Resume" per la mia applicazione Cocoa?
- 16. Framework di test di integrazione per testare un sistema distribuito?
- 17. Ottenere la data di sistema e il giorno separato, il mese e l'anno
- 18. Quadro di test per test funzionali/di sistema per C/C++?
- 19. Migliorare il disegno del codice per Cocoa?
- 20. Inserimento della data di sistema in oracle
- 21. Ricevere notifiche quando l'applicazione corrente cambia in Cocoa
- 22. differenza tra test funzionale e test di sistema?
- 23. Test UI Xcode con sistema di login
- 24. Come si avvia un'applicazione all'avvio del sistema? (Mac OSX, Cocoa)
- 25. XML nidificato per test dell'unità Data Driven
- 26. Aggiunta mesi per DateTime con DateInterval cambia data originale per abbinare nuova data
- 27. Navigazione breadcrumb per Cocoa
- 28. UITextField cambia il carattere durante la modifica
- 29. Registrazione per shareware Cocoa
- 30. Sommario (barra laterale) per la Guida di App Cocoa
In generale, è possibile sovrascrivere '- [Data NSDate]' nella categoria per restituire una data specifica. – brigadir