Skip to content

Instantly share code, notes, and snippets.

@fundter
Last active March 16, 2016 13:55
Show Gist options
  • Save fundter/f1ed73bd9beb8d6dfac3 to your computer and use it in GitHub Desktop.
Save fundter/f1ed73bd9beb8d6dfac3 to your computer and use it in GitHub Desktop.
Simple XCTest base class to handle filesystem based tests
//
// SampleTest.m
//
#import "TestBase.h"
@interface DiscoveryTests : TestBase
@end
@implementation DiscoveryTests {
NSURL *_library;
}
-(BOOL)requireFilesystem {
// Enable filesystem support. If enabled, a new temporary directory is
// created prior and deleted after each individual test.
return YES;
}
-(void)setUp {
// This one is important! Call before your setup code.
[super setUp];
// Now, setup a filesystem structure for the tests...
// Create some directories...
_library = [self createDirectory:@"JDocLibrary"];
NSURL *awmDocuments = [self createDirectory:@"AWM" insideDirectory:_library];
NSURL *companyDocuments = [self createDirectory:@"Company" insideDirectory:_library];
NSURL *flightDocuments = [self createDirectory:@"Flight" insideDirectory:_library];
NSURL *operatorDocuments = [self createDirectory:@"Operator" insideDirectory:_library];
// Copy some test resources...
[self copyResource:@"eawm_general" toDirectory:awmDocuments];
[self copyResource:@"jep-afom" toDirectory:operatorDocuments];
// Create temporary files...
[self createFile:@"test.txt" withContent:nil insideDirectory:companyDocuments];
}
- (void)test {
// Test code
}
@end
//
// TestBase.h
//
#import <XCTest/XCTest.h>
@interface TestBase : XCTestCase
@property NSURL *testLocation;
-(BOOL)requireFilesystem;
-(NSURL *)copyResource:(NSString *)resourceName;
-(NSURL *)copyResource:(NSString *)resourceName toDirectory:(NSURL *)directory;
-(NSURL *)createFile:(NSString *)name withContent:(NSData *)content;
-(NSURL *)createFile:(NSString *)name withContent:(NSData *)content insideDirectory:(NSURL *)directory;
-(NSURL *)createDirectory:(NSString *)name;
-(NSURL *)createDirectory:(NSString *)name insideDirectory:(NSURL *)directory;
@end
//
// TestBase.m
//
#import "TestBase.h"
@interface TestBase()
-(NSURL *)getResources;
@end
@implementation TestBase
-(BOOL)requireFilesystem {
return NO;
}
-(NSURL *)copyResource:(NSString *)resourceName {
return [self copyResource:resourceName toDirectory:self.testLocation];
}
-(NSURL *)copyResource:(NSString *)resourceName toDirectory:(NSURL *)directory {
NSError *error;
NSURL *source = [[self getResources] URLByAppendingPathComponent:resourceName];
NSURL *target = [directory URLByAppendingPathComponent:resourceName];
if (![[NSFileManager defaultManager] copyItemAtURL:source
toURL:target
error:&error]) {
NSLog(@"Error copying test resource: %@", error.localizedDescription);
return nil;
}
return target;
}
-(NSURL *)createFile:(NSString *)name withContent:(NSData *)content {
return [self createFile:name withContent:content insideDirectory:self.testLocation];
}
-(NSURL *)createFile:(NSString *)name withContent:(NSData *)content insideDirectory:(NSURL *)directory {
NSURL *file = [directory URLByAppendingPathComponent:name];
if (![[NSFileManager defaultManager] createFileAtPath:file.path contents:content attributes:nil]) {
NSLog(@"Error creating file: %@", name);
return nil;
}
return file;
}
-(NSURL *)createDirectory:(NSString *)name {
return [self createDirectory:name insideDirectory:self.testLocation];
}
-(NSURL *)createDirectory:(NSString *)name insideDirectory:(NSURL *)directory {
NSError *error;
NSURL *dir = [directory URLByAppendingPathComponent:name];
if (![[NSFileManager defaultManager] createDirectoryAtURL:dir withIntermediateDirectories:YES attributes:nil error:&error]) {
NSLog(@"Error creating test directory: %@", error.localizedDescription);
return nil;
}
return dir;
}
-(void)setUp {
[super setUp];
// Abort tests immediately when an assertion fails
self.continueAfterFailure = NO;
if ([self requireFilesystem]) {
NSError *error;
NSURL *location = [[NSURL fileURLWithPath:NSTemporaryDirectory()] URLByAppendingPathComponent:[[NSProcessInfo processInfo] globallyUniqueString]];
if ([[NSFileManager defaultManager] createDirectoryAtURL:location withIntermediateDirectories:YES attributes:nil error:&error]) {
self.testLocation = location;
}
else {
NSLog(@"Error creating test directory: %@", error.localizedDescription);
}
}
else {
_testLocation = nil;
}
}
-(void)tearDown {
if ([self requireFilesystem]) {
NSFileManager *fileManager = [NSFileManager defaultManager];
if ([fileManager fileExistsAtPath:self.testLocation.path]) {
[fileManager removeItemAtPath:self.testLocation.path error:nil];
}
}
[super tearDown];
}
-(NSURL *)getResources {
// Path to test resources
return [[NSBundle bundleForClass:self.class] URLForResource:@"Resources"
withExtension:nil];
}
@end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment